在 java.util.List 中的任何位置插入

2022-09-01 23:09:25

根据文档,您可以在列表中的任何位置插入对象:

此界面的用户可以精确控制每个元素在列表中的插入位置。

(资料来源:http://download.oracle.com/javase/6/docs/api/java/util/List.html)

但是以下程序失败,并显示 IndexOutOfBoundsException:

import java.util.ArrayList;

public class Test {
    public static void main(String[] args) {
        ArrayList<String> myList = new ArrayList<String>();
        myList.add(0, "derp");
        myList.add(2, "herp");

        for (String s : myList) {
            System.out.println("Le string: " + s);
        }
    }
}

它也无助于显式设置初始容量(这是有道理的,因为默认值为 10)。

为什么只要对象的索引低于容量,我就不能在任何位置插入对象?大小是否始终等于插入元素的数量?


答案 1

您可以在任何有效位置插入对象。仔细看看Javadoc的add(int,E)

抛出:
IndexOutOfBoundsException - 如果索引超出范围(index < 0 || index > size())

换句话说,插入元素始终会将列表的大小增加 1。您可以在任一端插入,也可以在中间插入...但你不能插入末尾。

容量实际上是一个实现细节 - 它控制何时需要用更大的支持数组替换支持数组以处理更多元素。列表的大小是这里的重要部分 - 容量为100但大小为5的列表仍然只是一个包含5个元素的列表,因此将位置67插入到这样的列表中是没有意义的。ArrayList


答案 2

列表容量与其大小不同。

容量是数组支持的列表(如 or )的属性,它是支持数组的已分配大小(即,在需要扩展结构之前可以放置的最大项数)。ArrayListVector

正如你所说,大小是列表中存在的元素的数量。

那么,只要有空间,为什么你不能在任何地方插入一个元素呢?很简单,因为接口没有指定对象是如何支持的,你不能在像;因此,同质(和正确)的行为是在发生这种情况时抛出异常。ListLinkedList

因此,您有两种选择:

  • 通过添加最大为所需大小的默认值来正确初始化列表。
  • 如果 是一个合理的默认值,则可以直接使用数组。null