考虑这个示例代码:
List<String> myList = new ArrayList<String>(7);
myList.add(5, "Hello");
myList.removeAll(Collections.singleton(null));
System.out.println(myList.size() + " objects:" );
for (String s : myList) {
System.out.println("\t" + s);
}
myList
使用初始容量 7 进行初始化,然后下一行尝试在位置 5 处添加字符串“Hello”。这将引发 IndexOutOfBoundsException:
线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引:5,大小:0
我查看了这个关于“初始容量”在 ArrayList 方面的含义的问题。我知道这个特定的构造函数正在为 7 个 String 元素分配空间,如果我们尝试将 8 个元素添加到列表中,它将不得不分配更多空间。
我不明白的是为什么它没有创建一个大小为 7 的“空”列表,每个索引都有空值,类似于我们声明String[] myArray = new String[7]
. 我记得了解到 ArrayList 是 Java 对动态数组的实现,所以我期待类似的行为。如果我在声明时实际上没有分配 7 个字符串的空间new ArrayList<String>(7)
,那么实际发生了什么?