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