expectedModCount是迭代器内部记录的集合修改计数快照,初始化为集合当前modCount;每次next()或remove()前比对二者是否一致,不一致则抛ConcurrentModificationException。

Java 中迭代器通过 expectedModCount 检测结构修改,本质是“快速失败”(fail-fast)机制的核心设计:它在迭代开始时记录集合的修改计数(modCount),后续每次调用 next() 或 remove() 前都比对当前 modCount 是否与预期值一致;不一致即抛出 ConcurrentModificationException。
expectedModCount 是什么
它是迭代器内部维护的一个整型字段,初始化时被赋值为集合当前的 modCount 值。而 modCount 是集合(如 ArrayList、HashMap)中用于记录结构性修改次数的计数器——增删元素会使其自增,仅修改已有元素内容(如 set(i, x))通常不会触发。
检测发生在哪些操作中
-
Iterator.next():每次取下一个元素前检查modCount == expectedModCount -
Iterator.remove():删除当前元素后,会同步更新expectedModCount = modCount(允许安全地在迭代中调用一次remove()) -
ListIterator.set()和add()同理,在执行后也会更新expectedModCount
为什么直接用 for-each 或普通 for 循环删除会报错
for-each 底层使用迭代器,但若在循环体内直接调用集合的 remove()(如 list.remove(obj)),会改变 modCount,而迭代器的 expectedModCount 未同步更新,下次 next() 就会发现不一致。
示例:
List如何安全修改结构
- 使用迭代器自身的
remove()方法(唯一推荐的遍历中删除方式) - 收集待删元素,遍历结束后统一调用
removeAll() - 倒序遍历索引(适用于
ArrayList等支持随机访问的集合):for (int i = list.size()-1; i >= 0; i--) - 使用
CopyOnWriteArrayList(适用于读多写少、允许弱一致性场景)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











