深入理解equals和==的区别

今天在群里面看到这个问题,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的人真牛逼!

一天一个小知识,一年就变成傻逼

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页