一,前言:
我们都知道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元素仅仅是发生了哈希冲突了,则去进行相应的处理。