HashMap詳解

HashMap爲何數組的長度是2的n次方

1.這個方法非常巧妙, 它通過 h & (table.length -1) 來得到該對象的保存位, 而HashMap 底層數組的長度總是 2 的 n 次方, 2n-1 得到的二進制數的每個位上的值都爲 1,那麼與全部爲 1 的一個數進行與操作, 速度會大大提升。

2.當 length 總是 2 的 n 次方時, h& (length-1)運算等價於對 length 取模, 也就是h%length, 但是&比%具有更高的效率

3.當數組長度爲 2 的 n 次冪的時候, 不同的 key 算得的 index 相同的機率較小,那麼數據在數組上分佈就比較均勻, 也就是說碰撞的機率小, 相對的, 查詢的時候不用遍歷某個位置上的鏈表, 這樣查詢效率也就較高了

HashMap爲什麼是線程不安全的?

在hashmap做put操作的時候會調用到以上的方法。現在假如A線程和B線程同時對同一個數組位置調用addEntry,兩個線程會同時得到現在的頭結點,然後A寫入新的頭結點之後,B也寫入新的頭結點,那B的寫入操作就會覆蓋A的寫入操作造成A的寫入操作丟失

當多個線程同時檢測到總數量超過門限值的時候就會同時調用resize操作,各自生成新的數組並rehash後賦給該map底層的數組table,結果最終只有最後一個線程生成的新數組被賦給table變量,其他線程的均會丟失。而且當某些線程已經完成賦值而其他線程剛開始的時候,就會用已經被賦值的table作爲原始數組,這樣也會有問題

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