從原始碼中我們可以看到獲取 key 所對應 node 陣列下標的方法是(length - 1) & hash,它與我們要求的hash % length在length 是 2 的 n 次方的條件下是等價的,而用這種 & 的位運算的方法相比直接用取餘符號進行運算,效能更好。
但是要明確一點,初始化時設定的長度不符合 2 的 n 次方也能正常初始化成功。
//可以看出原始碼中獲取下標的方法是(n - 1) & hash,n對應陣列長度
elseif(
(e = tab[index =
(n -1)
& hash]
)!= null)
hashmap知識點總結(附原始碼分析鏈結)
HashMap的長度為什麼要是2的n次方
hashmap訪問時,都需要計算當前key應該對應entry陣列哪個元素,即計算陣列下標 演算法如下 returns index for hash code h.staticintindexfor inth,intlength returnh length 1 hashmap為了訪問高效,要盡量較少...
HashMap 的長度為什麼是2的冪次方
為了能讓 hashmap 訪問高效,盡量較少碰撞,也就是要盡量把資料分配均勻。我們上面也講到了過了,hash 值的範圍值 2147483648到2147483647,前後加起來大概40億的對映空間,只要雜湊函式對映得比較均勻鬆散,一般應用是很難出現碰撞的。但問題是乙個40億長度的陣列,記憶體是放不下...
HashMap的長度為什麼要是2的N次方
先貼一段原始碼壓壓驚,the default initial capacity must be a power of two.static final int default initial capacity 1 4 aka 16見上面的原始碼中的注釋,must be a power of two ...