Java二维ArrayList无序指定索引添加元素触发异常原因
为什么ArrayList指定索引添加元素时跳索引会抛出IndexOutOfBoundsException?
核心原因
ArrayList的add(int index, E element)方法不允许跳空索引添加元素——它是基于动态数组实现的有序集合,并非稀疏数组,不会自动填充中间的空位。调用该方法时,传入的索引必须满足 0 ≤ index ≤ 当前集合的size,否则直接触发IndexOutOfBoundsException。
结合你的代码分析
正常运行的场景
- 执行
frisbeTeams.add(0,avocado)后,frisbeTeams的size变为1; - 接着
add(1,zen),此时索引1等于当前size(1),符合规则,元素被追加到末尾; - 最后
add(2,szupa),索引2等于当前size(2),同样合法,元素正常追加。
报错的场景
- 执行
frisbeTeams.add(0,avocado)后,frisbeTeams的size是1; - 此时调用
add(2,zen),传入的索引2大于当前size(1),违反了方法的索引校验规则,直接触发rangeCheckForAdd方法的范围检查,抛出异常。
源码层面的验证
从报错信息可以看到,异常来自ArrayList.rangeCheckForAdd方法,它的核心校验逻辑非常直白:
private void rangeCheckForAdd(int index) { if (index > size || index < 0) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }
只要索引超过当前集合的size,就会抛出异常。
解决思路
如果需要按指定索引存储子列表且允许跳索引,推荐使用Map<Integer, ArrayList<String>>,用键表示索引,值存储对应子列表,无需顾虑索引连续性:
Map<Integer, ArrayList<String>> frisbeTeams = new HashMap<>(); frisbeTeams.put(0, avocado); frisbeTeams.put(2, zen); frisbeTeams.put(1, szupa);
如果必须使用List结构,只能先填充中间空位(比如添加null占位),再替换对应位置的元素:
ArrayList<ArrayList<String>> frisbeTeams = new ArrayList<>(); frisbeTeams.add(0, avocado); // 填充索引1的空位 frisbeTeams.add(1, null); frisbeTeams.add(2, zen); // 替换索引1的元素 frisbeTeams.set(1, szupa);
内容的提问来源于stack exchange,提问作者asapsonter
相关产品推荐
相关产品推荐

