内部ArrayList的ensureCapacity()

时间:2015-06-14 14:53:43

标签: java arraylist

我有一个二维ArrayList对象

private ArrayList<ArrayList<Short>> VOL_2D = new ArrayList<ArrayList<Short>>();

现在我想在外部列表和所有内部列表上调用.ensureCapacity()(内部列表的数量已知,但它们尚未初始化)。对于外部列表很容易,我只需要定义我想要容纳的内部列表的数量。

在内部列表上调用此方法有一种很好的方法吗?或者每次初始化新的内部列表时都必须调用它?

4 个答案:

答案 0 :(得分:4)

没有像“二维ArrayList对象”这样的东西。您有一个ArrayList,其中包含ArrayList个对象。存储在外部列表中的所有对象可以具有不同的大小,其中一些可以是nullArrayList的子类。所以你必须明确添加足够的ArrayList个对象到外部数组列表中:

int n = // size of the outer list
int m = // size of the inner lists
private ArrayList<ArrayList<Short>> VOL_2D = new ArrayList<ArrayList<Short>>(n);
for(int i=0; i<n; i++)
    VOL_2D.add(new ArrayList<>(m));

请注意,ensureCapacity实际上并未向列表中添加任何元素。它只是调整内部数组的大小以适应指定数量的元素,因此不需要后续调整大小。在此之后创建一个空ArrayList并调用ensureCapacity是没有意义的:更好地使用ArrayList(minCapacity)构造函数,它将以更有效的方式执行相同操作。无论如何ensureCapacity只是为了提高性能。如果您确实希望在这些列表中包含元素,则可以使用:

for(int i=0; i<n; i++) {
    ArrayList<Short> inner = new ArrayList<>(m);
    for(int j=0; j<m; j++)
        inner.add(null); // or some other initial value
    VOL_2D.add(inner);
}

最后,如果你想拥有固定大小的二维ArrayList,为什么不直接创建这样的数组?

private short[][] VOL_2D = new short[n][m];

性能会更高。

答案 1 :(得分:0)

似乎你不明白这个结构的真正含义。你看,那些&#34;内在&#34;列表不知道它们可能会被收集在某些外部列表中。因此,没有方式(轻松)实现您的目标。

一种可能性:你可以扩展ArrayList;在你自己的课堂上,你可以覆盖所有会添加&#34;添加&#34;一个ArrayList ......你可以做任何你想做的事情;例如,设置所需的capcity。

答案 2 :(得分:0)

您不需要致电ensureCapacity

它只是一种用于优化的方法,以避免不必要的重新分配底层数组数据结构。

来自docs

  

应用程序可以增加ArrayList实例的容量   在使用ensureCapacity添加大量元素之前   操作。这可能会减少增量重新分配的数量。

答案 3 :(得分:0)

如果外部ArrayList大小已知且已修复,那么我建议您使用数组而不是ArrayList,如下所示。

int size = 10;

ArrayList<Short>[] VOL_2D = new ArrayList<Short>[size];

为什么需要致电ensureCapacity(int minCapacity)?你能详细说明你的用例吗?因为在创建实例时,您可以指定ArrayList的大小。如下所示

VOL_2D[0] = new ArrayList<Short>(30);

这将调用下面的构造函数,并创建一个30

的数组大小
 public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
    }

要回答你的问题,没有一个内置的方法会迭代列表中的所有元素并调用ensureCapacity。

您需要为此编写代码,如下所示

for(ArrayList<Short> vol : VOL_2D){
   vol.ensureCapacity(30);
} 

记住这一点,在调用ensureCapacity方法之前,需要初始化ArrayList对象(在你的情况下是所有内部的ArrayList对象),否则你最终会得到NullPointerException。