欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深入理解equals和==的区别

程序员文章站 2024-03-20 18:33:28
...

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

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

相关标签: Java基础 java