Arraylist自动扩容机制代码分析
时间: 2023-05-24 14:05:20 浏览: 124
ArrayList自动扩容机制是指,当数组不足以容纳元素时,自动扩容。其内部实现是在添加元素时判断数组容量是否足够,如果不够就创建一个原数组长度两倍的新数组,并将原数组中的元素复制到新数组中,然后把新元素添加到新数组中。
下面是ArrayList自动扩容机制的代码实现:
```
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
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);
}
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private static int hugeCapacity(int minCapacity) {...}
```
这段代码中,首先调用ensureCapacityInternal方法进行容量确认,然后如果需要扩容,会调用ensureExplicitCapacity方法进行扩容,这个方法又调用grow方法实现扩容。在grow方法内部,首先计算新容量,然后调用Arrays.copyOf方法将原数组复制到新数组中,完成扩容操作。
其中,MAX_ARRAY_SIZE是一个限制数组大小的常量,因为Java虚拟机规定数组的长度不能超过Integer.MAX_VALUE - 8,因此在扩容时需要考虑这个限制,避免出现数组长度溢出的情况。
阅读全文