為什么重寫(xiě)equals

為什么重寫(xiě)equals

先說(shuō)一說(shuō) == 比較

對(duì)于基本數(shù)據(jù)類型 == 比較的是數(shù)值
對(duì)于引用數(shù)據(jù)類型 == 比較的是地址

我們?cè)诔鯇W(xué)Java時(shí),String類我們會(huì)使用equals來(lái)比較兩個(gè)字符串的值是否相等
有些同學(xué)就會(huì)誤認(rèn)為equals比較的是引用類型的值。

但實(shí)際上,所有對(duì)象繼承自O(shè)bject類。默認(rèn)情況下,equals比較的仍然是地址。

我們來(lái)看一看Object中equals方法的源碼

public boolean equals(Object obj) {
        return (this == obj);
    }

this代表代用該方法的對(duì)象,obj表示要比較的對(duì)象。
我們發(fā)現(xiàn),equals方法又回到了兩者用等于號(hào)比較。
即引用數(shù)據(jù)類型 == 比較的是地址。
那為什么String類調(diào)用equals比較的是值呢?
因?yàn)镾tring類重寫(xiě)了equals方法

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;
    }

首先還是用==號(hào)比較,如果地址相同。兩者當(dāng)然也相同。
然后下一步,將里面的值進(jìn)行了比較。

對(duì)于大部分Java原生對(duì)象,大多都重寫(xiě)了equals方法。
如果不確定,可以ctrl+鼠標(biāo)左鍵點(diǎn)擊進(jìn)行查看。

所以我們?cè)谧远x對(duì)象時(shí),如果不重寫(xiě)equals方法。
那么比較的將是兩個(gè)對(duì)象的地址,即使值相同。但兩者地址不同,仍然會(huì)判斷為不相等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容