ArrayList 调整当前底层数组的大小还是创建一个新数组?我有时会读到 ArrayList 的“可调整大小的数组”,但是我认为每次“调整大小”时都会创建一个新数组。在现实中会发生什么,同一个数组会被调整大小或每次都创建一个新数组(容量限制结束)?
谢谢,确实是
您不能在 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);
}
}
将对象添加到 arrayList 时,如果超出容量,则将创建新数组,如下所示
Arrays.copyOf(elementData, newCapacity)
在内部,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,并指定了长度。它创建一个新数组,并根据数组的类型,用空值、零等填充。
Java中的数组大小是固定的。您不能动态增加数组的大小。
在将对象添加到 ArrayList 的情况下,它会检查 ensureCapacity(),如果超出限制,则始终创建新数组。
希望这会帮助你。