ArrayList调整当前底层数组的大小或创建一个新数组? 我读过有时会引用ArrayList的“可调整大小的数组”,但我认为每次“调整大小”时它都会被创建一个新的。 实际上会发生什么,同一个数组被调整大小或每次都创建一个新数组(容量限制结束)?
谢谢, 确实是的
答案 0 :(得分:6)
您无法在Java中调整数组大小。必须创建一个新的。
查看OpenJDK实现,您可以看到add
方法调用名为ensureCapacity
的方法,如果需要,可以通过复制来“调整”后备Object
数组的大小。< / p>
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);
}
}
答案 1 :(得分:1)
将对象添加到arrayList时,如果超出容量 然后将创建新数组,如下所示
Arrays.copyOf(elementData, newCapacity)
答案 2 :(得分:1)
在内部,ArrayList使用方法ensureCapacity来确保底层数组总是足够大。来自openjdk source:
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,并指定了长度。它创建一个新数组,并根据数组的类型,填充空值,零等等。
答案 3 :(得分:0)
Java中的数组大小是固定的。你无法动态增加数组的大小。
在向ArrayList添加对象的情况下,检查ensureCapacity(),如果超过限制,则始终创建新数组。
希望这会对你有帮助。