You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ArrayList含10001元素,逐个删除时中途触发IndexOutOfBoundsException

解决ArrayList删除元素时的IndexOutOfBoundsException问题

嘿,这个坑我踩过好多次!你遇到的IndexOutOfBoundsException根本原因是删除元素的方式没适配ArrayList的动态特性,咱们来捋清楚问题出在哪,以及怎么修复。

为什么会在删到5000个左右报错?

大概率你是用了这种错误的删除逻辑:

// 错误示例:用固定初始size循环删除
int initialSize = numberArrayList.size();
for (int i = 0; i < initialSize; i++) {
    numberArrayList.remove(i);
}

或者是没考虑size变化的从前往后循环:

// 错误示例:从前往后遍历,未处理size动态变化
for (int i = 0; i < numberArrayList.size(); i++) {
    numberArrayList.remove(i);
}

咱们拆解下原因:

  • ArrayList每次删除元素后,后面的元素会自动向前移动一位,同时集合的size会减1。
  • 如果从前往后删,删完索引i的元素后,下一个要处理的元素已经移到了i的位置,但循环会让i自增,直接跳过了这个元素;更致命的是,当删到一半时,集合实际size只剩5000左右,但循环还在按初始长度或不断缩小的size往前跑,当i超过集合当前的最大索引(size()-1),就会触发IndexOutOfBoundsException。

正确的删除方式

1. 从后往前遍历删除(简单直接)

从最后一个元素开始删,前面的元素位置不会影响当前索引,完全不会有越界问题:

for (int i = numberArrayList.size() - 1; i >= 0; i--) {
    numberArrayList.remove(i);
}

2. 使用迭代器删除(最安全的遍历删除方式)

如果需要在遍历过程中做判断再删除,迭代器是最优解,它专门处理集合遍历中的修改操作,不会触发异常:

Iterator<Integer> iterator = numberArrayList.iterator();
while (iterator.hasNext()) {
    iterator.next(); // 先获取当前元素
    iterator.remove(); // 用迭代器的remove方法删除
}

3. 直接清空(如果只是要删除所有元素)

如果你的需求就是删掉所有元素,别费劲循环了,直接调用clear()一步到位,效率还最高:

numberArrayList.clear();

总结

核心问题就是删除元素时集合的size在动态变化,但循环索引没有同步调整。选上面任意一种正确方式,都能解决你遇到的越界问题~

内容的提问来源于stack exchange,提问作者Pritam Bohra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:38:54