hashmap如何選下標

 

源代碼:

//計算32位hash值

static final int hash(Object key) {

int h;

return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

}

解釋:key.hashCode()得到32位hash整形值

h>>>16表示邏輯右移16位,左邊補16位0,相當於把高16位移動到低16位

^表示異或操作,相同爲0,不同爲1,爲1和0的概率都爲1/2

所以意思就是把32位hash值得高16位與低16位進行異或操作,返回處理過的32位hash值

 

 

//根據hash計算長度爲n的數組的下標

if ((p = tab[i = (n - 1) & hash]) == null)

tab[i] = newNode(hash, key, value, null);

解釋:n是數組長度,n是2的次冪,二進制是10000...的形式

則n-1爲1111的形式,任何數與之相與都會小於等於n-1

//1左移動四位得到16

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

解釋:1左移四位二進制則是10000,轉十進制,則是2^4次方=16

//將16作爲初始數組大小

newCap = DEFAULT_INITIAL_CAPACITY;

 

 

問題:爲什麼數組長度爲2^n次方

解答:因爲要從2^n-1中選擇數組下標,2^n-1的二進制形式爲n個1組成,當hash值與之相與,得到的數會小於等於2^n-1且算出相同數組下標概率低

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章