根据文档,您可以在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)。
为什么我不能在任何位置插入对象,只要它的索引低于容量?尺寸是否始终等于插入元素的数量?
答案 0 :(得分:25)
您可以在任何有效位置插入对象。仔细查看add(int, E)
的Javadoc:
<强>抛出:强>
IndexOutOfBoundsException - 如果索引超出范围(index < 0 || index > size())
换句话说,插入一个元素总是会使列表的大小增加1.您可以在任一端或中间插入...但是您不能插入过去结束
ArrayList
的容量实际上是一个实现细节 - 它控制何时需要用更大的替换替换阵列以应对更多元素。列表的 size 是这里的重要部分 - 容量为100但是大小为5的列表仍然只是5个元素的列表,因此将位置67插入到这样的列表中是没有意义的。
答案 1 :(得分:2)
列表容量与其大小不同。
容量是数组支持列表(例如ArrayList
或Vector
)的属性,它是支持数组的已分配大小(即,您可以放置的最大项目数)在需要发展结构之前)。
正如您所说,大小是列表中存在的元素数量。
那么,只要有足够的空间,为什么你不能在任何地方插入元素?很简单,因为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())
答案 5 :(得分:0)
将插入第一个myList.add(0, "herp")
,然后检查大小。然后,尺寸为1
,但您要插入位置2
。