看到很多equals与==号的说法,今天我也谈谈!
先放JavaObject源代码中的equals方法 java代码133行
public boolean equals(Object obj) {
return (this == obj);
}
通过在这个我们可以看到实际上equals和==的实现是一样的。那么为什么又有比较内存地址跟比较值得区分呢?
下面我们在看看一段代码(引用Java String 源代码 1005行)
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;
}
通过这段代码我们可以看到equals和==号本身是没有区别的,而子类中重写父类方法时进行了区分。
总结:
站在Object这层看equals和==没有区别;
从应用的角度看我们应该覆写equals方法加以区分它和==