1. 程式人生 > >HashMap底層詳解-002-hash演算法、長度的祕密

HashMap底層詳解-002-hash演算法、長度的祕密

第二天,小粉粉和小灰灰又遇見了……
微信公眾號:JavaWeb架構師
微信公眾號:JavaWeb架構師
微信公眾號:JavaWeb架構師
微信公眾號:JavaWeb架構師
微信公眾號:JavaWeb架構師
微信公眾號:JavaWeb架構師

之前咱們說過,有一個hash方法,用於計算元素的下標值。

index = hash(key)

在hash方法內部,我們通過key的hashCode值與HashMap的長度做某種運算,可以得到最後的index值。

微信公眾號:JavaWeb架構師

index = key.hashCode() % hashMap.length

微信公眾號:JavaWeb架構師

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)。
微信公眾號:JavaWeb架構師

微信公眾號:JavaWeb架構師

微信公眾號:JavaWeb架構師

微信公眾號:JavaWeb架構師

微信公眾號:JavaWeb架構師

微信公眾號:JavaWeb架構師

歡迎加入交流群:451826376

更多資訊:www.itcourse.top

完整教程PDF版本下載