Rod*_*eas 24 java string arraylist
考虑以下示例代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
myList 初始化初始容量为7,然后下一行尝试在位置5添加字符串"Hello".这会抛出IndexOutOfBoundsException:
线程"main"中的异常java.lang.IndexOutOfBoundsException:索引:5,大小:0
我查看了关于"初始容量"对于ArrayList意味着什么的这个问题.据我所知,这个特殊的构造函数为7个String元素分配了空间,如果我们尝试在列表中添加8个元素,则必须分配更多的空间.
我不明白的是为什么它不会创建大小为7的"空"列表,每个索引都有空值,类似于我们声明的情况String[] myArray = new String[7].我记得我知道ArrayList是Java的动态数组实现,所以我期待类似的行为.如果我在申报时实际上没有分配7个字符串的空间,new ArrayList<String>(7)实际发生了什么?
Jon*_*eet 22
我不明白为什么它不创建大小为7的"空"列表,每个索引都有空值,类似于我们声明String [] myArray = new String [7]时会发生的情况.
这在某些情况下会很有用......而在其他情况下则无用.通常你有一个你要创建的列表大小的上限(或者至少是一个猜测),然后你填充它......你不希望有一个列表,然后有一个错误的大小. ..所以你必须在"设置"值时保持索引,然后设置大小.
我记得我知道ArrayList是Java的动态数组实现,所以我期待类似的行为.
不,它真的不是.这是一个可以调整大小并在幕后使用数组的列表.尽量不要把它想象成一个数组.
如果我在申报新
ArrayList<String>(7)内容时实际上没有为7个字符串分配空间,那么实际发生了什么?
你做的有7个引用空间.该缓冲区的大小(即容量)至少为7,但逻辑列表的大小仍然是0 -你还没有添加任何东西给它.这就像你有一张足够长的7张纸,但你还没有写任何东西.
如果您想要一个预填充列表,您可以轻松编写一个方法来创建一个:
public static List<T> createPrefilledList(int size, T item) {
ArrayList<T> list = new ArrayList<T>(size);
for (int i = 0; i < size; i++) {
list.add(item);
}
return list;
}
Run Code Online (Sandbox Code Playgroud)
数组的初始容量与其大小(即数组包含的元素数)之间存在差异.它的大小用于确定您是否正在尝试访问超出范围的索引.
以下是ArrayList.java执行此检查的方法:
private void rangeCheckForAdd(int index) {
if (index < 0 || index > this.size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
Run Code Online (Sandbox Code Playgroud)
如您所见,它与阵列的初始容量无关.它完全基于它包含的元素数量.