Cem*_*mre 234 java arraylist indexoutofboundsexception
您可以通过执行设置ArrayList的初始大小
ArrayList<Integer> arr=new ArrayList<Integer>(10);
Run Code Online (Sandbox Code Playgroud)
但是,你做不到
arr.add(5, 10);
Run Code Online (Sandbox Code Playgroud)
因为它会导致越界异常.
如果您无法访问分配的空间,设置初始大小有什么用?
add函数定义为add(int index, Object element)我没有添加到索引10.
NPE*_*NPE 353
您将数组列表的大小与其容量混淆:
当您拨打电话时new ArrayList<Integer>(10),您正在设置列表的初始容量,而不是其大小.换句话说,当以这种方式构造时,数组列表的生命空白.
将十个元素添加到数组列表的一种方法是使用循环:
for (int i = 0; i < 10; i++) {
arr.add(0);
}
Run Code Online (Sandbox Code Playgroud)
完成此操作后,您现在可以修改索引0..9处的元素.
Ger*_*eld 96
如果您想要一个具有预定义大小的列表,您还可以使用:
List<Integer> arr = Arrays.asList(new Integer[10]);
Run Code Online (Sandbox Code Playgroud)
Far*_*Skt 41
如果你想使用Collections.fill(list,obj); 为了用重复的对象填充列表,你也可以使用
ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));
Run Code Online (Sandbox Code Playgroud)
该行将10次复制到您的ArrayList中
Nat*_*tix 19
容量的ArrayList是不一样的大小.大小等于ArrayList(和任何其他List实现)中包含的元素数量.
的容量是其用于存储internaly的元素的底层阵列的只是长度ArrayList,并且是始终大于或等于大小列表.
在调用set(index, element)列表时,它index与列表元素的实际数量(=大小)(在代码中为零,因此AIOOBE被抛出)有关,而与数组长度(=容量)无关(这是一个特定的实现细节)到ArrayList).
该set方法对于所有List实现是通用的,例如LinkedList,实际上不是由数组实现,而是作为链接的条目链.
编辑:你实际上使用的add(index, element)方法不是set(index, element),但原理在这里是相同的.
小智 10
如果要添加带索引的元素,则可以改为使用数组.
String [] test = new String[length];
test[0] = "add";
Run Code Online (Sandbox Code Playgroud)
我想你问题的确切答案是:
在ArrayList上设置初始大小会减少nr.内部存储器重新分配必须发生的时间.该列表由数组支持.如果指定初始容量为0,则在第一次插入元素时,必须调整内部数组的大小.如果您大致了解列表将包含多少元素,则设置初始容量将减少nr.使用列表时发生的内存重新分配.
这可能会帮助某人 -
ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
364110 次 |
| 最近记录: |