今天在群里面看到这个问题,equals和==的区别是什么?我有点迟钝,不就是如果是String类型的话equals比较的是内容,非字符串类型则比较的是内容吗?我想里面的考点也没有多少吧。
然后我就回复了一个:equals本来就是为了比较内容出现的啊。
这其实是一种没有理解原理,死记硬背的体现。于是我很快被打脸了。
知耻而后勇,我立马就去和度娘哭诉。
于是乎,我在网上果然又看到了那些“大佬”的解析,基本上无外乎是和我一样,给出结论,来两个demo。甚至乎,我还看到了一篇极易误导小白的文章。说了一大堆,给的demo也是没有代表性,最终还是得出equals比较字符串的结论。
言归正传,来讲一下我的理解:
首先我们来看底层代码,找到Object类的equals方法,我们可以看到:
public boolean equals(Object obj) {
return (this == obj);
}
好的这就是所有了,额,是不是发现equals方法本质和==并无区别,或者说,完全一样。
但是为什么在实际使用的时候,字符串用equals又不一样呢?
用排除法,我们显然可以得出结论,一定是String类的问题。
所以让我们来看看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的char[]的每个元素是否相等,即所谓的内容是否相同。
到这里我们的问题已经基本上解决。
但我不得不感叹一句:手写JDK的人真牛逼!