HashMap 容量為2次冪的原因

2021-09-01 15:20:15 字數 1111 閱讀 9857

我們都知道 hashmap 的底層是乙個陣列加鍊表的結構,當向其中新增乙個元素的時候,需要根據key的hash值,去確定其在陣列中的具體位置。

看原始碼,我們可以發現,確定陣列位置的實現是i=(n-1)& hash,其中 n 代表陣列的長度,即map的容量。

當n為2的冪次方時,(n-1)& hash 的值是均勻分布的,我們假設n=16,hash從0開始遞增:

hash

(n-1)& hash結果0

1111 & 001

1111 & 112

1111 & 1023

1111 & 1134

1111 & 10045

1111 & 1015……

…………

161111 & 10000017

1111 & 10001118

1111 & 10010

2當n不為2的冪次方時,(n-1)& hash 的值不是是均勻分布的,我們假設n=15,hash從0開始遞增:

hash

(n-1)& hash結果0

1110 & 001

1110 & 102

1110 & 1023

1110 & 1124

1110 & 10045

1110 & 1014……

…………

161110 & 10000017

1110 & 10001018

1110 & 10010

2由上面可以看出,當我們根據key的hash確定其在陣列的位置時,如果n為2的冪次方,可以保證資料的均勻插入,如果n不是2的冪次方,可能陣列的一些位置永遠不會插入資料,浪費陣列的空間,加大hash衝突。

另一方面,一般我們可能會想通過 % 求餘來確定位置,這樣也可以,只不過效能不如 & 運算。而且當n是2的冪次方時:hash & (length - 1) == hash % length

因此,hashmap 容量為2次冪的原因,就是為了資料的的均勻分布,減少hash衝突,畢竟hash衝突越大,代表陣列中乙個鏈的長度越大,這樣的話會降低hashmap的效能。

Hashmap的容量為什麼是2的冪次

做為面試常考的問題之一,每次都答的模模糊糊,有必要了解一下,首先來看一下hashmap的put方法的原始碼 public v put k key,v value modcount addentry hash,key,value,i 增加乙個新的entry到table i return null 如果...

HashMap的容量為什麼一直是2的次冪

初始容量 hashmap的初始化容量的為16,長度始終保持2的n次方,給hashmap初始化容量時如果不是2的指數次冪,它會自動變成最接近它的上面的2的指數次冪,如hashmaphm new hashmap 13 它的容量會自動轉成16 這樣做的好處當然是為了提高效率。hashmap是根據key的h...

HashMap初始容量為什麼是2的冪次方

hashmap初始容量為什麼是2的冪次方?hashmap中的資料結構是陣列 單鏈表的組合,我們希望元素存放的更均勻,最理想的效果是entry陣列中每個位置都只有乙個元素,這樣,查詢的時候效率最高,不需要遍歷單鏈表,也不需要通過equals去比較key,而且空間利用率最大。那麼如何計算才會分布最均勻呢...