要么我做错了,要么我不理解这种方法是如何工作的。
ArrayList<String> a = new ArrayList<String>();
a.ensureCapacity(200);
a.add(190,"test");
System.out.println(a.get(190).toString());
我原本以为ensureCapacity会让我插入一个索引最多达到该值的记录。有没有不同的方法来做到这一点?
我在第三行收到IndexOutOfBounds错误。
答案 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个空条目会导致滥用数据结构。
考虑使用标准基元数组。
如果您需要使用泛型或想要更有效地使用空间,请考虑::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());
}