ArrayList调整当前底层数组的大小或创建一个新数组?

时间:2013-10-14 17:58:43

标签: java arrays arraylist

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

谢谢,  确实是的

4 个答案:

答案 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(),如果超过限制,则始终创建新数组。

希望这会对你有帮助。