在Java开发过程中,集合部分报错经常会引起困惑。今天我们来分享一个常见的ArrayList索引访问越界报错,了解其根本原因及解决方案。
错误提示如下:
代码语言:javascript复制Index 1 out of bounds for length 0
意思是试图访问数组或List中的索引1,但该数组或List的长度为0。
这通常会出现在以下场景:
- 初始化一个空的ArrayList,但在循环/遍历中直接尝试添加元素。
- 假设ArrayList长度不会变化,但没有考虑添加元素后长度会增加的情况。
举个栗子:
代码语言:javascript复制List<String> list = new ArrayList<>();
for(int i = 0; i < 10; i ) {
list.add(i "");
}
第一轮添加时,list长度为0,但索引默认为1,就会出现索引超出范围的问题。
原因很简单,ArrayList在添加第一个元素前,它的underlying数组长度为0。
解决方案主要有以下几种:
- 初始化时预留长度,给ArrayList分配更大的数组:
List<String> list = new ArrayList<>(10);
- 每次添加前检查list长度:
if(list.size() > i){
list.add(i "");
}
- 使用其他动态扩容的集合如LinkedList
- Stream API写入元素避免索引问题
总之,在集合操作中一定要注意集合长度的动态变化,以免索引访问越界问题发生。如有疑问也可以与大家分享讨论。