HashMap的key可以重複嗎?

HashMap的key可以重複嗎?

如標題所問,答案是不可以!

為什麼不可以?

1.HashMap是基於哈希表的Map接口實現。此實現提供所有可選的映射操作,並允許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恆久不變。

2.HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。

3.HashMap存數據流程:

a.調用put(key,value)時,首先獲取key的hashcode,int hash = key.hashCode();

b.hash通過一下運算得到一個int h. 做到儘量均勻分佈。

hash ^= (hash >>> 20) ^ (hash >>> 12);

int h = hash ^ (hash >>> 7) ^ (hash >>> 4);

c.得到h之後,把h與HashMap的承載量(HashMap的默認承載量length是16,可以自動變長)進行邏輯與運算,即 h & (length-1),

得到的結果就是index。也就是索引將要插入的值在數組中的位置。還有一點需要說明,HashMap的鍵可以為null,它的值是放在數組的第一個位置。

d.用table[index]表示已經找到的元素需要存儲的位置。先判斷該位置上有沒有元素,沒有的話就創建一個Entity對象,在 table[index]位置上插入,這樣插入結束;如果有的話,通過鏈表的遍歷方式去逐個遍歷,看看有沒有已經存在的key,有的話用新的value替 換老的value;如果沒有,則在table[index]插入該Entity,把原來在table[index]位置上的Entity賦值給新的 Entity的next,這樣插入結束。

小結:面試中經常會被問到,知表知理才能掌握的牢固。HashMap的key是通過hashCode計算的唯一標識,但是value是可以重複的。如果非得抬槓重寫hashcode就另一回事了。


分享到:


相關文章: