为什么我并未重写equals方法,equals和==的结果就已经不一样了?
public class StringTest{
public static void main(String[] args){
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2)); //true
}
}
我并未重写equals方法,两个的结果不是应该一样么?可是编译运行之后却是不一样的? 展开
一张简图讲解
当使用==为false就是因为创建的是两个对象,在堆内存中是两个不一样的地址,对于引用类型,==只是比较引用地址是否一样,这里显然0x3344不等于0x5566
但通过equals的方法,因为String重写过了。代码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
比较的是内容是否一样。一样所以是ture
但如果String s1 = "abc";
String s2 = "abc";
使用==结果就是true,因为引用的地址是一样的,内容必然一样。
2018-06-11 广告
这里很显然,两个new String一定是两个对象,引用地址不一样。==返回的结果自然是false。
equals才是用来比较字符串的值的,返回true。它就是为了解决==无法直接比较String值的情况。
你可以再去看一下String中equals的源代码。它是先使用==比较,如果不相等,就去比较字符串长短,再比较两个字符串的每个字符是否相等。也就是在比较字符串的内容。
这里调用的是String类重写的equals方法。
如果有帮助到你,请点击采纳。