我們都知道 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,而且空間利用率最大。那麼如何計算才會分布最均勻呢...