hashmap的tablesizefor與擴(kuò)容機(jī)制

小樊
83
2024-08-17 18:28:38

tableSizeFor 是一個(gè)靜態(tài)方法,用來(lái)確保 HashMap 的容量是一個(gè)大于等于給定參數(shù)的最小的 2 的冪次方。這個(gè)方法的實(shí)現(xiàn)如下:

static final int tableSizeFor(int cap) {
    int n = cap - 1;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

在 HashMap 的實(shí)現(xiàn)中,當(dāng)元素的數(shù)量超過(guò)了負(fù)載因子(默認(rèn)為 0.75)乘以當(dāng)前容量時(shí),就會(huì)觸發(fā)擴(kuò)容操作。擴(kuò)容會(huì)創(chuàng)建一個(gè)新的更大的數(shù)組,將原數(shù)組中的元素重新計(jì)算哈希值并放入新數(shù)組中。

擴(kuò)容機(jī)制的實(shí)現(xiàn)如下:

  1. 當(dāng) HashMap 中的元素?cái)?shù)量超過(guò)了閾值(容量 * 負(fù)載因子),會(huì)觸發(fā)擴(kuò)容操作。
  2. 擴(kuò)容會(huì)將當(dāng)前的容量擴(kuò)大為原來(lái)的兩倍,并找到大于等于新容量的 2 的冪次方值。
  3. 然后創(chuàng)建一個(gè)新的數(shù)組,將原數(shù)組中的元素重新計(jì)算哈希值并放入新數(shù)組中。
  4. 最后將 HashMap 的數(shù)組引用指向新數(shù)組,完成擴(kuò)容操作。

因此,tableSizeFor 方法用來(lái)計(jì)算 HashMap 的容量,而擴(kuò)容機(jī)制則是確保 HashMap 在容量不足時(shí)能夠及時(shí)擴(kuò)容以保證性能。

0