java arraylist ensureCapacity无法正常工作

kra*_*626 14 java arraylist

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

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

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

我在第三行得到一个IndexOutOfBounds错误.

Jon*_*eet 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我的游行结束了。谢谢乔恩。现在我得想办法告诉我的孩子们 ;) (3认同)

tru*_*ity 5

所以正如其他人提到的那样,ensureCapacity不是为了这个。看起来您想从 200 个空值开始ArrayList?那么这将是最简单的方法:

ArrayList<String> a = new ArrayList<String>(Arrays.asList( new String[200] ));
Run Code Online (Sandbox Code Playgroud)

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

a.set(190, "test");
Run Code Online (Sandbox Code Playgroud)

这不同于

a.add(190, "test");
Run Code Online (Sandbox Code Playgroud)

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

如果您知道总会有 200 个元素,那么最好只使用数组。