有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中的任意位置插入。util。列表

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

The user of this interface has precise control over where in the list each element is inserted.

(来源: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) 个答案

  1. # 1 楼答案

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

    capacity是基础数组的长度,size是ArrayList表示的数组的长度

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

  2. # 2 楼答案

    列表容量与其大小不同

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

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

    那么,为什么只要有空间,就不能在任何地方插入元素呢?很简单,因为List接口没有指定对象的备份方式,并且您无法在类似LinkedList的情况下执行该操作;因此,同质(正确)行为是在发生异常时抛出异常

    所以你有两个选择:

    • 通过将默认值添加到所需大小来正确初始化列表
    • 如果null是一个合理的默认值,那么可以直接使用数组
  3. # 3 楼答案

    首先插入myList.add(0, "herp"),然后检查大小。然后,大小为1,但插入位置为2

  4. # 4 楼答案

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

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

    javadoc

  5. # 5 楼答案

    可以在任何有效位置插入对象。仔细查看^{}的Javadoc:

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

    换句话说,插入元素总是会使列表的大小增加1。你可以插入任何一端,或者中间…但是你不能插入超过结尾

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

  6. # 6 楼答案

    我的名单。添加(2,“herp”)应为myList。添加(1,“herp”)

    随着时间的增加,列表的大小是1,而不是2