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

Posted

技术标签:

【中文标题】在 java.util.List 中的任意位置插入【英文标题】:Insert at any position in java.util.List 【发布时间】:2011-12-12 10:55:46 【问题描述】:

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

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

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

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

投掷: IndexOutOfBoundsException - 如果索引超出范围(index &lt; 0 || index &gt; size())

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

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

【讨论】:

@fiskeben:这不是蹩脚的——如果你想要一个任意的键/值映射,请改用Map。如果您想要一个有序列表,您需要显式填充所有元素,而不是在不知道列表实际大小的情况下随机注入它们。【参考方案2】:

列表容量与其大小不同。

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

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

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

所以你有两个选择:

通过添加一个默认值来正确初始化列表,直到您想要的大小。 如果null 对您来说是一个合理的默认值,您可以直接使用数组。

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

容量是底层数组的长度,大小是ArrayList所代表的数组的长度

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

【讨论】:

【参考方案5】:

列表的大小总是等于插入元素的个数

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

javadoc

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于在 java.util.List 中的任意位置插入的主要内容,如果未能解决你的问题,请参考以下文章

Java集合框架-顶层接口

Java集合---List和Set

java 中的List 最大可以存放多少条数据

mybatis批量插入数据

java中在arraylist表中的字符串类型数值怎么取

[X] 中的 [getAssociatedToEntities] 操作接受 [java.util.List] 类型的参数