23

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

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

(来源: 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)。

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

4

6 回答 6

30

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

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

换句话说,插入一个元素总是将列表的大小增加 1。您可以在任一端或中间插入......但不能插入到末尾

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

于 2011-10-21T09:48:18.743 回答
2

myList.add(2, "herp") 应该是 myList.add(1, "herp")

随着 List 的大小增加 1,而不是 2。

于 2011-10-21T10:02:30.157 回答
2

列表容量与其大小不同。

容量是数组后备列表(如ArrayListor Vector)的属性,它是后备数组的分配大小(即在需要增长结构之前可以放置的最大项目数)。

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

那么,为什么只要有空间就不能在任何你想要的地方插入元素呢?很简单,因为List接口没有指定对象是如何被支持的,而且你不能用LinkedList;之类的东西来做。所以同质(和正确)的行为是在发生这种情况时抛出异常。

所以你有两个选择:

  • 通过将默认值添加到所需大小来正确初始化列表。
  • 如果null对您来说是一个合理的默认值,您可以直接使用数组。
于 2011-10-21T09:47:29.393 回答
0

首先myList.add(0, "herp")将被插入,然后它会检查大小。然后, size 是,1但您在 position 插入2

于 2011-10-21T11:04:27.827 回答
0

ArrayList 有两个成员:容量和大小

capacity 是底层数组的长度,size 是 ArrayList 表示的数组的长度

所以你必须在列表中添加数据,以便 ArrayList 本身获得你想要插入数据的大小

于 2011-10-21T09:49:44.413 回答
0

列表的大小始终等于插入元素的数量

Throws:
IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())

文档

于 2011-10-21T09:50:25.653 回答