為什么重寫(xiě) equals() 方法,一定要重寫(xiě) hashCode() 呢?| HashMap

微信搜索??「碼農(nóng)田小齊」,關(guān)注這個(gè)在紐約的程序媛,回復(fù)「01-05」可以獲取計(jì)算機(jī)精選書(shū)籍、個(gè)人刷題筆記、大廠面經(jīng)、面試資料等資源,么么噠~

首先我們有一個(gè)假設(shè):任何兩個(gè) object 的 hashCode 都是不同的。

那么在這個(gè)條件下,有兩個(gè) object 是相等的,那如果不重寫(xiě) hashCode(),算出來(lái)的哈希值都不一樣,就會(huì)去到不同的 buckets 了,就迷失在茫茫人海中了,再也無(wú)法相認(rèn),就和 equals() 條件矛盾了,證畢。

撒花~~??????

接下來(lái)我們?cè)賹?duì)這兩個(gè)方法一探究竟:

其實(shí) hashCode() 和 equals() 方法都是在 Object class 這個(gè)老祖宗里定義的,Object 是所有 Java 中的 class 的鼻祖,默認(rèn)都是有的,甩不掉的。

那既然是白給的,我們先來(lái)看看大禮包里有什么,谷歌 Object 的 Oracle 文檔:

所以這些方法都是可以直接拿來(lái)用的呢~

回到 hashCode() 和 equals(),那么如果這個(gè)新的 class 里沒(méi)有重寫(xiě) (override) 這兩個(gè)方法,就是默認(rèn)繼承 Object class 里的定義了。

那我們點(diǎn)進(jìn)去來(lái)看看 equals() 是怎么定義的:

記筆記:

equals() 方法就是比較這兩個(gè) references 是否指向了同一個(gè) object.

嗯???你在逗我嗎??那豈不是和 == 一樣了??

補(bǔ)充:
我們常用的比較大小的符號(hào)之 ==
如果是 primitive type,那么 == 就是比較數(shù)值的大?。?br> 如果是 reference type,那么就比較的是這兩個(gè) reference 是否指向了同一個(gè) object。

再補(bǔ)充:
Java 的數(shù)據(jù)類型可以分為兩種:
Primitive type 有且僅有8種:byte, short, int, long, float, double, char, boolean.
其他都是 Reference type.
所以雖然 Java 聲稱 “Everything is object”,但是還是有非 object 數(shù)據(jù)類型的存在的。

我不信,我要去源碼里看看它是怎么實(shí)現(xiàn)的。

?

哈,還真是的,繞了這么半天,equals() 就是用 == 來(lái)實(shí)現(xiàn)的!

那為什么還弄出來(lái)這么個(gè)方法呢?

答:為了讓你 override~

比如一般來(lái)說(shuō)我們比較字符串就是想比較這兩個(gè)字符串的內(nèi)容的,那么:

str1 = “tianxiaoqi”;
str2 =  new String(“tianxiaoqi”);

str1 == str2; // return false
str1.equals(str2); // return true 

因?yàn)?String 里是重寫(xiě)了 equals() 方法的:

老祖宗留給你就是讓你自己用的,如果你不用,那人家也提供了默認(rèn)的方法,也是夠意思了。

好了,我們?cè)偃タ?hashCode() 的介紹:

那至于 hashCode() 返回的究竟是什么,和本文關(guān)聯(lián)不太大,有興趣的同學(xué)可以看參考這篇文章,結(jié)論就是:

返回的并不一定是對(duì)象的(虛擬)內(nèi)存地址,具體取決于運(yùn)行時(shí)庫(kù)和JVM的具體實(shí)現(xiàn)。

但無(wú)論是怎么實(shí)現(xiàn)的,都需要遵循文檔上的約定,也就是對(duì)不同的 object 會(huì)返回唯一的哈希值。

所以說(shuō),

hashCode() 決定了 key 放在這個(gè)桶里的編號(hào),也就是在數(shù)組里的 index;

equals() 是用來(lái)比較兩個(gè) object 是否相同的。

如果你喜歡這篇文章,記得給我點(diǎn)贊留言哦~你們的支持和認(rèn)可,就是我創(chuàng)作的最大動(dòng)力,我們下篇文章見(jiàn)!

我是小齊,紐約程序媛,終生學(xué)習(xí)者,每天晚上 9 點(diǎn),云自習(xí)室里不見(jiàn)不散!

更多干貨文章見(jiàn)我的 Github: https://github.com/xiaoqi6666/NYCSDE

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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