我有一个二维ArrayList
对象
private ArrayList<ArrayList<Short>> VOL_2D = new ArrayList<ArrayList<Short>>();
现在我想在外部列表和所有内部列表上调用.ensureCapacity()
(内部列表的数量已知,但它们尚未初始化)。对于外部列表很容易,我只需要定义我想要容纳的内部列表的数量。
在内部列表上调用此方法有一种很好的方法吗?或者每次初始化新的内部列表时都必须调用它?
答案 0 :(得分:4)
没有像“二维ArrayList对象”这样的东西。您有一个ArrayList
,其中包含ArrayList
个对象。存储在外部列表中的所有对象可以具有不同的大小,其中一些可以是null
或ArrayList
的子类。所以你必须明确添加足够的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。