java arraylist ensureCapacity无法正常工作

时间:2011-10-07 13:46:29

标签: java arraylist

要么我做错了,要么我不理解这种方法是如何工作的。

ArrayList<String> a = new ArrayList<String>();
a.ensureCapacity(200);
a.add(190,"test");
System.out.println(a.get(190).toString());

我原本以为ensureCapacity会让我插入一个索引最多达到该值的记录。有没有不同的方法来做到这一点?

我在第三行收到IndexOutOfBounds错误。

8 个答案:

答案 0 :(得分:35)

不,ensureCapacity不会更改ArrayList逻辑大小 - 它会更改容量,这是列表的大小可以在下一个需要复制值之前到达。

您需要非常了解逻辑大小之间的差异(即[0, size)范围内的所有值都可以访问,添加新元素会将其添加到索引size)和容量更多的是实现细节 - 它是用于存储的后备阵列的大小。

调用ensureCapacity应该只在性能方面做出任何改变(避免过度复制) - 如果你明白我的意思,它不会影响列表中的内容的逻辑模型。

编辑:听起来你想要一种ensureSize()方法,它可能看起来像这样:

public static void ensureSize(ArrayList<?> list, int size) {
    // Prevent excessive copying while we're adding
    list.ensureCapacity(size);
    while (list.size() < size) {
        list.add(null);
    }
}

答案 1 :(得分:3)

正如其他人所说ensureCapacity并非如此。 看起来你想要开始使用ArrayList 200个空值?那么这将是最简单的方法:

ArrayList<String> a = new ArrayList<String>(Arrays.asList( new String[200] ));

然后,如果你想用“test”替换元素190,请执行:

a.set(190, "test");

这与

不同
a.add(190, "test");

将在索引190中添加“test”并将其他9个元素向上移动,从而得到一个大小为201的列表。

如果你知道你总是要有200个元素,那么使用数组可能会更好。

答案 2 :(得分:2)

确保容量不会将项目添加到列表中。如果已经添加了191个元素,则只能获取元素190或添加元素190。 “容量”只是ArrayList 在需要调整其内部数据结构(数组)之前可以保持的对象数。如果ArrayList有一个getCapacity(),那么这样做:

ArrayList<String> a = new ArrayList<String>();
a.ensureCapacity(200);
System.out.println(a.size());
System.out.println(a.getCapacity());

将分别打印0和大于或等于200的某个数字

答案 3 :(得分:1)

ArrayList将其容量(内部数组的大小)与其大小(添加的元素数)分开维护,“set”方法取决于已经分配给元素的索引。没有办法设置大小。如果需要,可以添加带循环的虚拟元素:

for (int i = 200; --i >= 0;) a.add(null);

答案 4 :(得分:0)

再一次JavaDoc澄清情况:

Throws: IndexOutOfBoundsException 
    - if index is out of range (index < 0 || index > size()).

请注意size()返回列表当前持有的元素数。

答案 5 :(得分:0)

ensureCapacity只是确保底层数组的容量大于或等于参数。它不会改变ArrayList的大小。它不会通过API显示任何更改,因此除了在ArrayList调整内部数组大小之前可能会更长时间之外,您不会注意到差异。

答案 6 :(得分:0)

向ArrayList添加190个空条目会导致滥用数据结构。

  1. 考虑使用标准基元数组。

  2. 如果您需要使用泛型或想要更有效地使用空间,请考虑::ffff:1.2.3.4甚至像SparseArray Map可能适合您的目的。

答案 7 :(得分:0)

  public static void fillArrayList(ArrayList<String> arrayList, long size) {
    for (int i = 0; i < size + 1; i++) {
      arrayList.add(i,"-1");
    }
  }

public static void main(String[] args) throws Exception {
  ArrayList<String> a = new ArrayList<String>(10);
  fillArrayList(a, 190);
  a.add(190,"test");
  System.out.println(a.get(190).toString());
}