关于String类中重写的equals()方法
前言
首先承接前一篇关于浅析equals和==运算符中提到的关于String类中重写equals()方法
- 先上一盘代码,让你尝尝:
public class Equals {
public static void main(String[] args) {
Equals e1 = new Equals();
Equals e2 = new Equals();
System.out.println(e1 == e2);
System.out.println(e1.equals(e2));
String s1 = new String();
String s2 = new String();
System.out.println(s1.equals(s2));
Equals e3 = e2;
System.out.println(e3.equals(e2));
}
}
运行结果:
false
false
true
true
首先我们来分析一下上面的结果:
-首先“==”运算符在java中如果是用于两个对象的引用的话,那么只有当这两个引用指向同一个内存地址(同一块堆空间),才能返回true。
-Equals 类是继承了Object类的,此时Equals 的对象e2调用的equals()方法是弗雷Object类中的方法,而在Obejct类中的equals()方法是这样写的:
public boolean equals(Object obj){
return (this == obj);
}
所以equals()方法的实现原理与“==”运算符一样,所以返回了与e1一样的值false;
但是String类中重写了equals()方法,它的方法体满足了:只要两个引用所指向的对象时两块含有一样的字符串的话,那就返回true。
在最下面的一个true也是这个原因:直接把e2的引用赋给了e3,所以两个引用指向同一块内存。所以e2=e3;所以虽然equals()方法没有重写,也是返回true。
- String类重写的equals()方法源代码:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n– != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
- 解释:它首先判断的是两个对象的引用是否指向同一内存地址,是的话就返回true ,否则继续往下走,往下走时,判断是否为String类的对象,然后比较两个字符串的长度和内存,当都相等的时候就返回true ,否则返回false。
很明显,它比较的就是两个对象的引用所指向的内存地址。