1. 程式人生 > >HashMap的預設容量為何為16?為何是2的整數倍?

HashMap的預設容量為何為16?為何是2的整數倍?

static int indexFor(int h, int length) {         return h & (length-1); }我們知道對於HashMap的table而言,資料分佈需要均勻(最好每項都只有一個元素,這樣就可以直接找到),不能太緊也不能太鬆,太緊會導致查詢速度慢,太鬆則浪費空間。計算hash值後,怎麼才能保證table元素分佈均與呢?我們會想到取模,但是由於取模的消耗較大,HashMap是這樣處理的:呼叫indexFor方法

HashMap原始碼中有一個indexFor方法,返回的是key的hashcode跟初始容量-1做與運算

首先length為2的整數次冪的話,h&(length-1)就相當於對length取模,這樣便保證了雜湊的均勻,同時也提升了效率

其次,length為2的整數次冪的話,為偶數。這樣length-1為奇數,奇數的最後一位為1,這樣便保證了h&(length-1)的最後一位為0,也可能為1(這取決於h的值),即與後的結果可能為偶數也可能是奇數。這樣便可以保證雜湊的均勻性

而如果length為奇數的話,很明顯length-1為偶數,它的最後一位是0,這樣h&(length-1)的最後一位肯定為0,即只能為偶數,這樣任何hash值都只會被雜湊到陣列的偶數下標位置上,這便浪費了近一半的空間。所以,length取2的整數次冪,是為了使不同hash值發生碰撞的概率較小,這樣就能使元素在雜湊表中均勻地雜湊。