HashMap底層詳解-002-hash演算法、長度的祕密
阿新 • • 發佈:2019-02-17
第二天,小粉粉和小灰灰又遇見了……
之前咱們說過,有一個hash方法,用於計算元素的下標值。
index = hash(key)
在hash方法內部,我們通過key的hashCode值與HashMap的長度做某種運算,可以得到最後的index值。
index = key.hashCode() % hashMap.length
1.對hash值進行調整
/**
* 如果Key值為null,返回0;如果Key值不為空,返回原hash值和原hash值無符號右移16位的值按位異或的結果。
* 按位異或就是把兩個數按二進位制,相同就取0,不同就取1。
* 所以這個hash()函式對於非null的hash值,僅在其大於等於2^16的時候才會重新調整其值。
*/
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
2.進行與運算
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
// n的值是表長
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
// (n - 1) & hash,與hash值進行與元素
if ((p = tab[i = (n - 1) & hash]) == null)
tab[i] = newNode(hash, key, value, null);
//…………
我們知道 n-1 的二進位制值是 1111,它與任何數進行與運算,結果都是那個數的最後四位(<=15)。