1. 程式人生 > >為什麼HashMap的初始容量一定要設定為16(2的整數次冪)?

為什麼HashMap的初始容量一定要設定為16(2的整數次冪)?

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函式雜湊後的雜湊值在陣列中的下標只能是偶數,這樣就浪費了近一半的空間。