為什麼HashMap的初始容量一定要設定為16(2的整數次冪)?
阿新 • • 發佈:2019-01-05
HaspMap的資料結構是陣列加單鏈表,把初始容量設定為2的冪有助於HashMap中的元素存放地更均勻,降低了hash碰撞的概率,提高了查詢的效率和空間利用率。
最理想的情況是Entry陣列中每一個位置都只存放一個元素,這樣在查詢的時候不用去遍歷連結串列,這時候空間利用率最大,時間複雜度最優。
計算最均勻的是對length取模運算:雜湊值%容量=bucketIndex(桶位)
/** * Returns index for hash code h. */ // h為經過hashcode計算後得到的雜湊值 //length為當前的容量 static int indexFor(int h, int length) { //這裡使用的是位運算子 return h & (length-1); }
位運算子h&(length-1)可以實現一個均勻分佈,當初始容量為2的整數次冪時,h & (length-1) 就等價於 h%length(對length取模),這時候元素在雜湊表中能夠更加均勻地雜湊。
另外:如果length為2的整數次冪時,也就是length為偶數,那麼length-1為奇數,在位運算中奇數的最後一位為1,這樣保證了在做h&(length-1)位運算後,最後一位有可能是0,也有可能是1(當h為0的時候是0,h為1的時候為1),這時候Key的hashcode經過hash函式雜湊後的雜湊值在陣列(桶中)的下標既可以的奇數也可以是偶數。當然如果length為奇數,那麼length-1就為偶數,做h&(length-1)位運算後最後一位只能是0,也就是經過hash函式雜湊後的雜湊值在陣列中的下標只能是偶數,這樣就浪費了近一半的空間。