問題引導: 在學習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碼。
(作者知識有限,如有不對的地方,懇請批評指正或聯系我)