Java遍历集合时防止快速失败异常的方法
ConcurrentModificationException由modCount与expectedModCount不一致触发,体现fail-fast机制;单线程遍历中直接调用集合remove()也会触发,安全删除应使用Iterator.remove()、removeIf()或批量移除。
ConcurrentModificationException由modCount与expectedModCount不一致触发,体现fail-fast机制;单线程遍历中直接调用集合remove()也会触发,安全删除应使用Iterator.remove()、removeIf()或批量移除。

ConcurrentModificationException 是怎么被触发的
Java 的 ArrayList、HashMap 等非线程安全集合,内部维护一个 modCount 计数器。每次结构修改(如 add()、remove())都会递增它;而迭代器在创建时会记录当时的 expectedModCount。遍历时只要发现两者不一致,就立刻抛出 ConcurrentModificationException —— 这是「快速失败」(fail-fast)机制,不是并发安全保证,只是检测到“可能出错”就报错。
注意:这个异常不一定发生在多线程场景下。单线程里边遍历边用集合自身方法删元素,一样会触发:
Listlist = new ArrayList<>(Arrays.asList("a", "b", "c")); for (String s : list) { if ("b".equals(s)) list.remove(s); // ⚠️ 这里直接调用 list.remove() 就会爆 }
单线程遍历时安全删除的三种写法
核心原则:别让迭代器和集合的修改操作混在一起。推荐以下方式:
- 用
Iterator.remove()—— 唯一被设计为遍历时安全删除的方式:Iterator
it = list.iterator(); while (it.hasNext()) { String s = it.next(); if ("b".equals(s)) it.remove(); // ✅ 合法,会同步更新 expectedModCount } - 用
removeIf()(Java 8+)—— 内部封装了安全遍历逻辑:list.removeIf("b"::equals); // ✅ 简洁且安全 - 收集待删元素,遍历结束后批量删(适合条件复杂或需多次判断):
List
toRemove = new ArrayList<>(); for (String s : list) { if (needRemove(s)) toRemove.add(s); } list.removeAll(toRemove); // ✅ 避开遍历期修改
多线程环境下该选哪个集合
如果真有多个线程同时读写,不能只靠规避异常,得换线程安全的实现:
CopyOnWriteArrayList:适合读多写少,每次写操作复制整个数组,迭代器基于快照,不会抛ConcurrentModificationException,但内存和写性能代价大ConcurrentHashMap:支持高并发读写,keySet()/values()返回的集合是弱一致性视图,遍历时不会因其他线程修改而报错(但可能看不到最新修改)- 慎用
Collections.synchronizedList():它只给每个方法加synchronized,但迭代仍是复合操作(hasNext()+next()),仍需手动同步整个遍历块:synchronized (list) { for (String s : list) { ... } }
为什么增强 for 循环无法捕获 ConcurrentModificationException
增强 for 循环底层就是用 Iterator,但它把 next() 和异常处理全包在字节码里,你没法在循环体里 catch 它 —— 异常会直接跳出循环并向上抛。想兜底?只能在外层 try/catch,但这掩盖了根本问题:说明你的遍历逻辑本身存在结构性风险。
真正要警惕的,不是“怎么 catch 这个异常”,而是“为什么会在遍历中途改集合”。哪怕用 CopyOnWriteArrayList 避开了异常,若业务上要求强实时一致性,它返回的旧快照反而可能引入更隐蔽的 bug。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。
Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,













