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()之間互不影響,互不相關。