ArrayList?是 Java 中的一個常用集合類,用于動態數組的實現。ArrayList?的底層是一個數組,當數組容量不夠時,ArrayList?會自動擴容以容納更多的元素。
在大多數情況下,ArrayList?擴容時會將容量增加到原先容量的 1.5 倍左右,但實際上并不是精確的 1.5 倍。具體的擴容機制可以從?ArrayList?的源碼中看到:
private void grow(int minCapacity) {
// 獲取舊的容量
int oldCapacity = elementData.length;
// 新容量為舊容量的 1.5 倍(實際上是 oldCapacity + (oldCapacity >> 1))
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 如果新容量仍然小于最小需求容量,則將新容量設置為最小需求容量
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 如果新容量超出了數組的最大容量,則處理溢出情況
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// 復制舊數組到新數組
elementData = Arrays.copyOf(elementData, newCapacity);
}
從上面的代碼可以看到,ArrayList?的擴容機制是將舊容量右移一位(相當于除以 2),然后加上舊容量,這樣新容量大約是舊容量的 1.5 倍。
但是由于整數運算的原因,新容量并不總是精確的 1.5 倍。例如,如果舊容量是 10,那么新容量將是 10 + (10 >> 1) = 10 + 5 = 15,這正好是 1.5 倍。但如果舊容量是 11,那么新容量將是 11 + (11 >> 1) = 11 + 5 = 16,這并不是精確的 1.5 倍。
總結來說,ArrayList?的擴容機制是近似 1.5 倍,但由于整數運算的原因,不能保證每次擴容都是精確的 1.5 倍。