ArrayList扩容原理源码讲解
时间: 2024-05-14 08:14:27 浏览: 68
ArrayList的扩容原理源码如下:
```java
private void grow(int minCapacity) {
// 获取当前ArrayList容量
int oldCapacity = elementData.length;
// 容量增加1.5倍,右移1位相当于除以2
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 如果新容量小于最小容量,则将最小容量作为新容量
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 如果新容量超出最大容量,则调用hugeCapacity方法获取最大容量
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// 将原数组复制到新数组中
elementData = Arrays.copyOf(elementData, newCapacity);
}
```
当ArrayList的元素数量超过其容量时,就需要进行扩容操作。ArrayList的扩容操作是通过grow()方法实现的。该方法首先获取当前ArrayList的容量oldCapacity,然后将其增加1.5倍(右移1位相当于除以2),得到新的容量newCapacity。如果新容量小于最小容量,则将最小容量作为新容量;如果新容量超出了ArrayList所能承受的最大容量MAX_ARRAY_SIZE,则调用hugeCapacity方法获取最大容量。
最后,将原数组复制到新数组中,这样就完成了ArrayList的扩容操作。需要注意的是,每次扩容都会创建一个新的数组,并将原数组中的元素复制到新数组中,这样会导致一定的开销。因此,在使用ArrayList时,应该尽量避免频繁进行扩容操作,以提高性能。
阅读全文