在 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 < 0 || index > size())
换句话说,插入一个元素总是会使列表的大小增加 1。您可以在任一端插入,也可以在中间插入...但不能在末尾插入 过去 .
ArrayList
的 容量 实际上是一个实现细节 - 它控制何时需要用更大的数组替换后备数组以处理更多元素。列表的 size 是这里的重要部分 - 容量为 100 但大小为 5 的列表仍然只是 5 个元素的列表,因此在位置 67 插入这样的列表是没有意义的。
【讨论】:
@fiskeben:这不是蹩脚的——如果你想要一个任意的键/值映射,请改用Map
。如果您想要一个有序列表,您需要显式填充所有元素,而不是在不知道列表实际大小的情况下随机注入它们。【参考方案2】:
列表容量与其大小不同。
容量是数组后备列表的属性(例如ArrayList
或Vector
),它是后备数组的分配大小(即在需要增长之前可以放置的最大项目数结构)。
正如您所说,大小是列表中存在的元素数。
那么,只要有空间,你为什么不能在任何你想要的地方插入一个元素呢?很简单,因为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 中的任意位置插入的主要内容,如果未能解决你的问题,请参考以下文章
[X] 中的 [getAssociatedToEntities] 操作接受 [java.util.List] 类型的参数