要么我做错了,要么我不理解这种方法是如何工作的.
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)
所以正如其他人提到的那样,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 个元素,那么最好只使用数组。
| 归档时间: |
|
| 查看次数: |
16442 次 |
| 最近记录: |