源代碼:
//計算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且算出相同數組下標概率低