栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

String的equals方法原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

String的equals方法原理

一,前言:

        我们都知道String的equals方法,是用来比较两个字符串的内容是否是相等的,

        如果比较内存地址用的是==。

        那么String的equals方法是如何来比较两个字符串的内容是否是相等的呢?

        今天一起翻翻源码看看:

·

二,源码解析:
public boolean equals(Object anObject) {
	//如果指定对象和当前对象的内存地址相等,则啥都不用说了,在内存中都是同一个对象了,直接返回true;
	if (this == anObject) {
		return true;
	}
	//如果指定对象和当前对象的内存地址不相等:
	//则判断指定对象是否是String类型,如果不是,则直接返回false;
	//如果指定对象是String类型,则继续:
	if (anObject instanceof String) {
		//则先将该对象强转为String对象:
		String anotherString = (String)anObject;
		//比较指定对象与当前对象的字符串长度,如果长度不一致,则直接返回false;
		int n = value.length;		
		if (n == anotherString.value.length) {
			//如果指定对象与当前对象的字符串长度一致,
			//则遍历这两个字符串对象中的每一个char字符,
			//如果遍历过程中有一个char字符不一致,则直接返回false;
			char v1[] = value;
			char v2[] = anotherString.value;
			int i = 0;
			while (n-- != 0) {
				if (v1[i] != v2[i])
					return false;
				i++;
			}
			//如果遍历结束,每个char字符都一致,则返回true;
			return true;
		}
	}
	return false;
}

· 

总体步骤就是:

        1,如果指定对象和当前对象的内存地址相等,则说明在内存中都是同一个对象,所以直接返回true;

        2,如果指定对象和当前对象的内存地址不相等,则判断指定对象是否是String类型;

        2.1,如果指定对象不是String类型,则直接返回false;

        2.2,如果指定对象是String类型,则继续:

        2.2.1,先将该对象强转为String类型;

        2.2.2,然后比较指定对象与当前对象的字符串长度,如果长度不一致,则直接返回false;

        2.2.3,如果指定对象与当前对象的字符串长度一致,则遍历这两个字符串对象中的每一个char字符,

        2.2.4,如果遍历过程中有一个char字符不一致,则直接返回false;

        2.2.5,如果遍历结束,每个char字符都一致,则返回true;

·

char字符类型如何比较内容是否相等?

        答案就是:直接用==就行了。

        因为Java采用Unicode编码,而且Unicode字符集中的前128个字符与Ascll字符集兼容, 所以在java中,char类型的数据是unicode编码字符,

        所以Java中的char型数据的运算和比较,对应着一张ASCII码表。

        所以两个char类型的数据,直接用==比较即可;

char类型方面,详情参见:

Java中的char类型的数据的运算和比较_Morning sunshine的博客-CSDN博客_java判断char是否相等

 ·

三,String的equals()方法 与 Object的equals()方法:

·

1)联系:

        我们都知道,在Java中,任何一个类默认都是继承自Object类;

        所以其实String也不例外,String里边的equals方法,其实是覆盖重写了Object中的equals方法。

·

2)区别:

区别也很明显:

  •         String里边的equals方法是比较两个字符串对象的内容是否是相等的;
  •         Object里边的equals方法是比较两个对象的内存地址是否是一致的,如果一致,即意味着这两个对象在内存中其实是一个对象,则返回true,否则返回false;

·

拓展: Object里边的equals方法:
public boolean equals(Object obj) {
	return (this == obj);
}

        注意,当我们写代码的时候,每当要重写Object的该equals方法时,通常都需要重写hashCode方法(也是Object类中的),以保证相等的对象必须具有相等的哈希码。

·

3)使用场景的区别:

        除了String字符串类型比较内容是否相等之外,

        其他大多数的类都是继承使用的Object的equals()方法,即比较内存地址;

        如果想比较类里边的内容比如说根据某个变量进行判断,那么我们需要在编写该类的时候,自己重写该Object的equals方法、以及hashCode方法。

·

举例:

        比如说,在HashMap的put方法中的判断该key是否重复的时候,有一个步骤就是:

        先判断这两个key的hashcode哈希码是否一致,

        如果两个key的哈希码一致、并且用==或者Object的equals()方法比较发现这两个key的内存地址也一致,则判断出这是同一个key,即元素重复了。

if (p.hash == hash &&
       ((k = p.key) == key || (key != null && key.equals(k))))
    e = p;

        如果两个key的哈希码一致、但是用==或者Object的equals()方法比较发现这两个key的内存地址不一致,则说明此时两个entry元素仅仅是发生了哈希冲突了,则去进行相应的处理。

详情参见:HashMap的put方法与get方法_Morning sunshine的博客-CSDN博客

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/854857.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号