一般情况
我们可以这么理解,==
是对引用的比较,也就是比较两个对象是否指向相同的存储位置。而equals()
是比较两个对象的值是否相等。
这个在一般情况下是成立的,但是……
我们通过查看jdk源码,发现:
public boolean equals(Object obj) {
return (this == obj);
}
发现没有,equals()
方法最开始的判断依据就是比较两个对象是否相等,也就是说和==
用法是相同的,没有区别。
但是由于equals()
是可以被override
(覆盖,覆写)的,所以我们可以将equals()
改成我们想要的方法。例如:String 类型里面,equals()
被改写成:
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;
}
也就是比较两个String类的对象里面的字符是否相等。
所以可以这么理解,如果equals()
方法没有被覆写,那么他就会默认比较两个对象的地址,这个和==
是一个意思。如果equals()
方法被覆写了,我们就得依据覆写的新方法来判断。
注意:
- 基本类型的对象是没有
equals()
方法的,但是其包装类是有equals()
方法的,比较的是对象的内容。 - 如果我们在覆写
equals()
方法时,要记得覆写hashCode()
,这样不会造成冲突,因为如果equals()
返回的结果是true
的话,这两个对象的hashCode()
方法返回的值一定相同,反过来未必是正确的。
(continued)
版权声明:本文为博主原创文章,未经博主允许不得转载。