農林漁牧網

您現在的位置是:首頁 > 農業

java的hashcode作用及hashCode()和equals()的關係

2022-08-15由 飛車阿耐 發表于 農業

hashmap hashcode;hashcode是什麼

hashcode第一個作用

是用於給某個物件在雜湊表中找到應該存放到陣列的位置。具體實現原理為:獲取該物件的hashcode,取模得到的值即為它存放在陣列的位置。

第二個作用

知道了在陣列中該位置還不夠,就好像知道了別人住某層樓,但不知道住哪號房。該位置存放著一條連結串列,連結串列的每個位置住著許多其他物件,這時候就要透過自己的hashcode和別人的hashcode來比較是否是同一個物件。當hashcode不同,則認為是不同物件,它就可以存進去。否則當hashcode相同,還需要用equals方法來進一步比較是否是同一物件。

當我們設計某個類,確定這種類的物件需要用到HashMap或Hashtable等等這種散列表來儲存,我們設計該類時要滿足下述條件:

我們對該類的hashCode()和equals()進行重寫時:

1。當equals()判斷兩個物件相等為true時,它們hashCode()的值必然要相等;

2。反過來,當hashCode()的值相等時,不需要確保equals()判斷的值為true。

3。但是當hashCo()的值不相等時,equals()判斷的值必然為false。

為什麼呢,因為HashMap或Hashtable等等這種散列表需要先根據物件的hashCode()來判斷同一物件,相同則再用equals()來判斷同一物件。

舉個例子,我寫了一個類,並重寫它的equals()為根據類的內容來判斷是否為同一物件,但我沒有重寫它的hashCode()方法,因此它的hashCode()沿用Object的hashCode()即根據類在記憶體中的地址生成hashcode。

那麼當我往HashSet中儲存兩個內容相同,地址不同的物件時,很顯然,HashSet會根據它兩的hashcode判斷出是兩個不同的物件,兩個物件同時被儲存在HashSet中,但這就違背了我equals()對兩物件是否相同的定義。因此設計equals()和hashCode()需要滿足上述三個條件。

而如果我們很肯定我們設計的類的物件不會用到HashMap或Hashtable等等這種散列表來儲存時,我們則無需滿足上述條件,hashCode()和equals()之間互不影響,互不相關。

java的hashcode作用及hashCode()和equals()的關係