private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
我的问题:
虽然定义减少 8 位,但是后面如果还是不够用,那么还是可以继续扩容的。为何定位减少 8 ?为何能扩容?
目前解释:①存储 Headerwords ;②避免一些机器内存溢出,减少出错几率,所以少分配③最大还是能支持到 Integer.MAX_VALUE
最终还是有疑问:如果集合容量无限接近最大值,那么官方解释中集合存储的 HeaderWords 呢,难道被清除掉了?