有什么情况我应该在ArrayList外部使用ensureCapacity()吗?

时间:2016-07-04 09:44:09

标签: java arraylist java-8 capacity

以下代码确保内部容量为11,

ArrayList list = new ArrayList(11);

那么为什么/何时应该在外部使用公共方法ensureCapacity()?

list.ensureCapacity(11);

如果没有用,为什么要公开?

public void ensureCapacity(int minCapacity) {
    int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
        // any size if not default element table
        ? 0
        // larger than default for default empty table. It's already
        // supposed to be at default size.
        : DEFAULT_CAPACITY;

    if (minCapacity > minExpand) {
        ensureExplicitCapacity(minCapacity);
    }
}

3 个答案:

答案 0 :(得分:5)

致电new ArrayList(n)初始化容量为ArrayList的{​​{1}}。

但是,您可能希望向已创建的n添加大量元素并且ArrayList已满。假设我们想要添加ArrayList个新元素。

调用x然后添加元素会比仅添加元素并让list.ensureCapacity(n + x)动态调整大小更有效。

考虑这个粗略的例子:

List

答案 1 :(得分:1)

如果您不想自动调整arrylist的大小并希望保持对自己的控制,则可能需要使用它。例如你创建了一个5大小的ArrayList。如果添加第6个元素,它将为5 + 5,即10个元素创建一个空格。如果您不希望arryList的大小加倍,可以使用list.ensureCapacity来判断您需要多少元素。

这适用于小数据,但假设您的arrayList增长到5K。

根据java文档https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

An application can increase the capacity of an ArrayList instance before adding a large number of elements using the ensureCapacity operation. This may reduce the amount of incremental reallocation.

答案 2 :(得分:0)

您应该将ensureCapacity主要用作确保可增长数组容量的任何其他方法:在没有多次重新分配的情况下添加预先知道的大量项目,因为如果您逐个添加项目列表由于阵列容量耗尽,可能会有很多重新分配。

考虑一个简单的场景,你有一个10个元素的数组,并且重新分配是以2为增长因子,如果添加1024个项目,你将有10个重新分配,ensureCapacity(1034)只有一个(在追加开始时)。