在java语言中,经常容易引起大家疑惑的一个部分就是 equals 与 ==的区别,到底他们都有哪些区别呢?
我们首先来追本溯源,看看equals到底是从哪里来的?它最原本的机制是什么样子的?
在java中所有对象的都有一个父类就是Object,既然针对每个对象都可以调用equals,那么自然这个equals也是父类应该有的方法。
(实在不知道这个注释怎么粘贴,凑合看吧)
public boolean equals(Object obj) {
return (this == obj);
}
大致意思就是,equals方法是用来被设计成非空对象之间用来判定是否是同一个对象的方法。任何对象的equals方法必须符合五个标准
- 自反性
- 对称性
- 传递性
- 一致性
- 任何非空 x.equlas(null) 应该返回为false
需要特别注意的是如果要复写equals方法的话,大部分都要复写hashCode()用于保证相对的对象一定要hash值一致。
可以看到它的方法体,也是用到了==操作符,所以默认情况下,二者是相同的。
我们经常看到的不同,原因就是String这个类复写了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;
}
同样复写了hashCode
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
如上我们在源码中看到的,在String这个类中,只要对象的值相等就可以认为是equals。
所以总体来说就是,如果两个对象满足==,那么一定满足equals,相反则不一定成立。
当然复写equals方法的类很多 例如AbstractList,它则判断list集合中的内容,以及顺序是相同则认为是equals。Integer等。