深入理解equals和==的區別

俏兒還有我發表於2020-09-26

今天在群裡面看到這個問題,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的人真牛逼!

一天一個小知識,一年就變成傻逼

相關文章