java arraylist 确保容量不工作

2022-09-02 23:19:57

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

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

我本来以为确保Capacity会允许我插入一个索引高达该值的记录。有没有其他方法来做到这一点?

我在第三行上收到一个 IndexOutOfBounds 错误。


答案 1

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

您需要非常了解逻辑大小(即范围中的所有值都可以访问,添加新元素将在索引处添加它)与容量之间的区别,这实际上是一个实现细节 - 它是用于存储的支持数组的大小。[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);
    }
}

答案 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 的数字


推荐