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

时间:2011-10-21 09:46:14

标签: java list indexoutofboundsexception

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

  

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

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

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

6 个答案:

答案 0 :(得分:25)

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

  

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

换句话说,插入一个元素总是会使列表的大小增加1.您可以在任一端或中间插入...但是您不能插入过去结束

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

答案 1 :(得分:2)

列表容量与其大小不同。

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

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

那么,只要有足够的空间,为什么你不能在任何地方插入元素?很简单,因为List接口没有指定对象的备份方式,你不能像LinkedList那样做;因此,同类(和正确)行为是在发生这种情况时抛出异常。

所以你有两个选择:

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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

javadoc

答案 5 :(得分:0)

将插入第一个myList.add(0, "herp"),然后检查大小。然后,尺寸为1,但您要插入位置2