ArrayList自动扩容怎么实现

2024-01-10

在Java中,ArrayList是通过动态数组实现的,它会根据需要自动增加容量。当ArrayList的容量不足以容纳新元素时,会自动增加容量。

ArrayList的自动扩容是由ensureCapacity方法实现的。当需要添加新元素时,ArrayList会先检查当前容量是否足够,如果不够则会调用ensureCapacity方法进行自动扩容。

ensureCapacity方法的实现如下:

private void ensureCapacity(int minCapacity) {
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        int newCapacity = (oldCapacity * 3) / 2 + 1;
        if (newCapacity < minCapacity) {
            newCapacity = minCapacity;
        }
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
}

该方法首先获取当前容量oldCapacity,然后判断需要的最小容量minCapacity是否大于当前容量。如果是,则计算新的容量newCapacity,通常是原容量的1.5倍加1。然后,使用Arrays.copyOf方法将元素数据elementData扩容到新的容量。

需要注意的是,ArrayList的自动扩容会导致数组的重新分配和拷贝,因此在频繁添加大量元素时,可能会影响性能。为了避免频繁的扩容操作,可以事先估计需要添加的元素数量,调用ArrayList的构造函数或者ensureCapacity方法设置合适的初始容量。