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
相关产品推荐
相关产品推荐

