parallelStream 会导致Index 1 out of bounds for length 0?解决

2024-01-25 14:24:40 浏览数 (1)

在Java开发过程中,集合部分报错经常会引起困惑。今天我们来分享一个常见的ArrayList索引访问越界报错,了解其根本原因及解决方案。

错误提示如下:

代码语言:javascript复制
Index 1 out of bounds for length 0

意思是试图访问数组或List中的索引1,但该数组或List的长度为0。

这通常会出现在以下场景:

  1. 初始化一个空的ArrayList,但在循环/遍历中直接尝试添加元素。
  2. 假设ArrayList长度不会变化,但没有考虑添加元素后长度会增加的情况。

举个栗子:

代码语言:javascript复制
List<String> list = new ArrayList<>();

for(int i = 0; i < 10; i  ) {
  list.add(i   ""); 
}

第一轮添加时,list长度为0,但索引默认为1,就会出现索引超出范围的问题。

原因很简单,ArrayList在添加第一个元素前,它的underlying数组长度为0。

解决方案主要有以下几种:

  1. 初始化时预留长度,给ArrayList分配更大的数组:
代码语言:javascript复制
List<String> list = new ArrayList<>(10);
  1. 每次添加前检查list长度:
代码语言:javascript复制
if(list.size() > i){
  list.add(i "");
}
  1. 使用其他动态扩容的集合如LinkedList
  2. Stream API写入元素避免索引问题

总之,在集合操作中一定要注意集合长度的动态变化,以免索引访问越界问题发生。如有疑问也可以与大家分享讨论。

0 人点赞