HashMap為保證鍵的唯一性覆蓋equals和hashCode的原因?


問題引導: 在學習HashMap的過程中會遇到這樣的一個疑問,要保證鍵的唯一性,需要覆蓋hashCode方法,和equals方法,那么為何為了保證鍵的唯一性就要哦覆蓋hashCode方法,和equals方法?

 

分析過程如下: 

HashMap的處理過程:

1.每個對象都會通過hashCode()方法生成一個整形值(散列碼)

2.處理散列碼:

在對HashMap插入對象和查詢對象時會進行以下處理:

1.HashMap會檢查插入對象和查詢對象的散列碼是否在之前就已經存在,如果散列碼不存在則在添加到HashMap中.

2.如果散列碼存在則會調用equals()方法處理要插入對象和查詢對象,判斷插入對象和查詢對象在HashMap中是否有相等的key(鍵),如果在HashMap中有相等的鍵,那么就會用新的Value替換掉老的Value,並返回老的Value

 

為何要重寫eqauls()方法?

兩個對象相同(即equals比較兩個對象時返回true),那么它們的hashCode一定相同 hashCode相同的兩個對象,它們並不一定相同(即equals比較兩個對象時返回false) equals函數是所有類都會從Object類處繼承的函數,當我們在HashMap中存儲我們自己定義的類的時候,默認的equals函數的行為可能不能符合我們的要求,所以需要重寫

不重寫hashCode()方法導致的問題?

兩個對象相同(即equals比較兩個對象時返回true),那么它們的hashCode一定相同

hashCode相同的兩個對象,它們並不一定相同(即equals比較兩個對象時返回false)

如果你重寫了equals,而保留hashCode的實現不變則對象對應的hashCode不一樣,那么很可能會導致如下情況: 兩個相等的對象A、B,hashCode卻不一樣,當以A作為鍵保存到HashMap中,以B作為鍵去查找A的值時,就會出現找不到的情況.(相同的鍵但找不到相應的值).因此要重寫HashCode()方法以保證相等的對象有唯一的hashCode碼。

 

 

(作者知識有限,如有不對的地方,懇請批評指正或聯系我)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM