使用可變類作爲HashMap鍵值所帶來的問題

面試的時候問到過這個問題,之前看書的時候也看到過,記得不算很牢固。
只隱約記得推薦使用不變類如 String,Integer 。

使用可變類作爲HashMap鍵會帶來什麼問題?

如果使用可變類作爲HashMap的鍵值,而不重寫HashCode 和equals 方法,使用會產生同一鍵(對等的兩個對象)存在兩個地方的問題,產生可以存在重複鍵值 的假象。

爲什麼會產生這種現象,這就得看HashMap 怎麼進行的put操作

HashMap 進行put操作 先拿到 key 的HashCode ,再對這個值執行hash函數拿到hash值,然後調用indexFor(hash, table.length); 方法找到hash 數組的槽位,如果key值爲空,則賦值在0號槽位,然後遍歷該槽位所在的鏈表,用key.equals判斷如果存在相同的key就替換,否則用頭插法加到槽位所在鏈表處。

具體過程各位看官請閱讀HashMap源碼,我這裏看的是1.7 的版本。


通過分析HashMap put的過程我們知道,HashCode 主要用來定位 到哈希表的數組槽位,equals方法用來判斷鏈表中是否有相同的key。如果沒有重寫HashCode方法,則調用的是Object的HashCode(返回對象的內部地址轉換的一個整數值),兩個理應對等的對象存在了不同的槽位所在鏈表,如果沒有重寫equals方法(Object的equals方法判斷的是引用地址),兩個理應對等的對象存在了同一個槽位所在鏈表的不同節點,而不是覆蓋。

參考鏈接:
[[Java基礎要義] Java語言中Object對象的hashCode()取值的底層算法是怎樣實現的?](http://blog.csdn.net/luanlouis/article/details/41547649)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章