java循环遍历集合时修改元素会触发concurrentmodificationexception,应避免迭代中直接调用集合方法修改结构;推荐使用iterator的remove()、倒序for循环、收集后批量处理或线程安全集合。

在循环遍历集合时直接修改元素(如增删改)会触发 ConcurrentModificationException,这是 Java 集合的快速失败(fail-fast)机制导致的。核心解决思路是:**避免在迭代过程中用集合自身的方法修改结构,改用线程安全或支持迭代中修改的方式**。
使用 Iterator 的 remove() 方法安全删除
这是最常用、最推荐的删除方式。Iterator 提供了专为迭代中删除设计的 remove() 方法,它能同步更新内部修改计数器,避免异常。
- 只能在调用
next()之后调用一次remove() - 不支持添加或替换元素,仅限删除当前元素
- 示例:
用 for 循环倒序遍历删除(适用于 List)
对 ArrayList 等基于索引的 List,从后往前遍历时,删除元素不会影响尚未访问的前面索引,可规避下标越界和漏删问题。
- 适合按条件批量删除,逻辑直观
- 注意:不能用于 LinkedList(性能差),且不适用于 Set 或 Map
- 示例:
收集待操作元素,遍历结束后统一处理
先遍历原集合,把要删/改的元素(或其索引)存入临时容器,再执行批量操作。适用于复杂判断或多操作类型(如同时删 A、改 B)。
- 内存开销略增,但逻辑清晰、适用性广
- 删除时建议用
removeAll();修改可遍历原集合并查表替换 - 示例(删除):
选用支持并发修改的集合类型
若场景本身需要高并发读写,可考虑线程安全集合,如 CopyOnWriteArrayList(适合读多写少)、ConcurrentHashMap。它们允许迭代时修改,但有各自限制:
-
CopyOnWriteArrayList迭代器基于快照,看不到新增元素,且写操作开销大 -
ConcurrentHashMap的迭代器弱一致性,不抛ConcurrentModificationException,但可能跳过或重复元素 - 注意:它们不是万能解法,需权衡一致性、性能与语义需求
不复杂但容易忽略,关键在区分“遍历”和“修改”两个动作的时机与工具。选对方式,异常自然消失。










