0

ArrayList 调整当前底层数组的大小还是创建一个新数组?我有时会读到 ArrayList 的“可调整大小的数组”,但是我认为每次“调整大小”时都会创建一个新数组。在现实中会发生什么,同一个数组会被调整大小或每次都创建一个新数组(容量限制结束)?

谢谢,确实是

4

4 回答 4

6

您不能在 Java 中调整数组的大小。必须创建一个新的。

查看 OpenJDK 实现,您可以看到该add方法调用了一个名为的方法,该方法将在需要时通过复制ensureCapacity来“调整”后备数组的大小。Object

public void  ensureCapacity(int minCapacity) {
    modCount++;
    int oldCapacity = elementData.length;
    if (minCapacity > oldCapacity) {
        Object oldData[] = elementData;
        int newCapacity = (oldCapacity * 3)/2 + 1;
        if (newCapacity < minCapacity)
            newCapacity = minCapacity;
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
}
于 2013-10-14T18:00:51.440 回答
1

将对象添加到 arrayList 时,如果超出容量,则将创建新数组,如下所示

Arrays.copyOf(elementData, newCapacity)
于 2013-10-14T18:07:47.130 回答
1

在内部,ArrayList 使用方法 ensureCapacity 来确保底层数组总是足够大。来自openjdk 源代码

178     public void ensureCapacity(int minCapacity) {
179         modCount++;
180         int oldCapacity = elementData.length;
181         if (minCapacity > oldCapacity) {
182             Object oldData[] = elementData;
183             int newCapacity = (oldCapacity * 3)/2 + 1;
184             if (newCapacity < minCapacity)
185                 newCapacity = minCapacity;
186             // minCapacity is usually close to size, so this is a win:
187             elementData = Arrays.copyOf(elementData, newCapacity);
188         }
189     }

在第 187 行,您可以看到它调用了 Arrays.copyOf,并指定了长度。它创建一个新数组,并根据数组的类型,用空值、零等填充。

于 2013-10-14T18:12:31.177 回答
0

Java中的数组大小是固定的。您不能动态增加数组的大小。

在将对象添加到 ArrayList 的情况下,它会检查 ensureCapacity(),如果超出限制,则始终创建新数组。

希望这会帮助你。

于 2013-10-14T18:16:35.237 回答