https://www.nowcoder.com/feed/main/detail/6784e01cd32e47dc937adef2756df7bb?sourceSSR=users

chatgpt

在Java中,ArrayList的扩容是一个重要的性能优化过程。 ArrayList底层是基于数组实现的,因此当现有数组无法容纳更多元素时, ArrayList会创建一个更大的数组并将现有元素复制到新的数组中。

以下是ArrayList扩容的步骤:

1. 触发扩容

扩容会在向ArrayList添加元素时发现内部数组已满时触发:

• 方法:add(E e) 或其他需要增加元素的方法,如addAll(Collection c)。

• 条件:当前容量(size)达到底层数组的最大容量( elementData.length)。

2. 计算新容量

扩容时,ArrayList会根据一定的规则计算新容量。核心逻辑在 **ensureCapacityInternal()**方法中实现。以下是主要规则:

默认容量:当数组为空时(即初次扩容),默认容量为10

增量规则:新容量是原容量的 1.5倍,即:

newCapacity = oldCapacity + (oldCapacity >> 1);

(oldCapacity >> 1 表示 oldCapacity / 2,即原容量的50%)

调整为所需最小容量:如果 newCapacity不足以满足需求(例如大量元素被添加),则会调整为所需的最小容量。

3. 创建新数组

通过Arrays.copyOf()方法创建一个新数组:

• 将新容量用于分配更大的数组。