恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

P07 · ConcurrentModificationException:边遍历边删除,ArrayList 翻脸了

  • 首页
  • 资讯中心
  • /
  • P07 · ConcurrentModificationException:边遍历边删除,ArrayList 翻脸了

相关资讯

游戏AI为何犯傻?从路径寻路到状态机,解析可笑行为背后的技术原理 2026/9/5 8:45:05
从昇腾到寒武纪:国产AI加速卡实战踩坑与落地指南 2026/9/5 8:45:05
C语言指针返回局部变量地址为何崩溃?栈帧生命周期与安全返回方案 2026/9/5 8:45:05

最新资讯

YOLOv8牙科解剖数据集构建与模型训练全流程实战
iPad Pro妙控键盘深度评测:第三方配件能否替代苹果原厂?
NSST图像融合实战:从工具箱部署到融合算法实现
多形态系统缺的不是能力,而是边界与治理规矩
基于SpringBoot+Vue的编程训练平台:从架构设计到安全判题实战
2026年AI工具实用指南:五个方向,一个核心工作流

今日推荐

流式背压机制:避免前端渲染卡死与内存暴涨的滑动窗口限流
幂等性设计:在 Agent 自动重试与工具执行中的防重复扣费实战
向量检索与标量过滤混合查询:PostgreSQL pgvector 与 Milvus 的过滤下推实操

本周热门

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析
数字电路时序基石:深入理解建立时间与保持时间
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

P07 · ConcurrentModificationException:边遍历边删除,ArrayList 翻脸了

发布时间:2026/9/5 8:45:05
P07 · ConcurrentModificationException:边遍历边删除,ArrayList 翻脸了 P07 · ConcurrentModificationException边遍历边删除ArrayList 翻脸了场景还原需求很简单——“把列表里所有叫 b 的元素删掉”。你顺手写了个 for-each在循环里直接list.remove(s)自信地点击运行……然后看着满屏红色发呆java.util.ConcurrentModificationException—— ArrayList 表示“你一边逛街一边拆店我不干了。”一、问题现象开始遍历删除删除所有等于 b 的元素 ... Exception in thread main java.util.ConcurrentModificationException at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1095) at java.base/java.util.ArrayList$Itr.next(ArrayList.java:1049) at ConcurrentDemo.main(ConcurrentDemo.java:7)二、出错代码importjava.util.*;publicclassConcurrentDemo{publicstaticvoidmain(String[]args){ListStringlistnewArrayList(Arrays.asList(a,b,c,d,e));for(Strings:list){// 增强 for 遍历内部用的是迭代器if(b.equals(s)){list.remove(s);// ← 遍历过程中直接删除元素}}System.out.println(删除完成: list);}}三、为什么会这样for-each遍历集合底层靠的是迭代器Iterator。迭代器内部记着一个modCount修改次数每次调用next()时都会检查如果集合的modCount和自己记录的一致→ 说明没人动过集合放心继续如果不一致→ 说明在你遍历期间有人改了集合add、remove、clear 都会让 modCount 1迭代器立刻翻脸ConcurrentModificationException。你直接在循环里调list.remove(s)改的是集合本身迭代器并不知情只有用iterator.remove()才会同步更新迭代器的状态于是下一次next()检查时当场爆炸。名字里的 “Concurrent” 有点误导——单线程这样写同样会报它不是并发问题而是遍历期间结构被修改的问题。四、怎么解决方案一用迭代器的 remove()推荐简洁安全IteratorStringitlist.iterator();while(it.hasNext()){Stringsit.next();if(b.equals(s)){it.remove();// ✅ 迭代器自己的删除方法状态同步更新}}System.out.println(list);// [a, c, d, e]方案二先收集再统一删逻辑更直观适合条件复杂的情况ListStringtoRemovenewArrayList();for(Strings:list){if(b.equals(s))toRemove.add(s);}list.removeAll(toRemove);方案三一行流式写法JDK 8实际开发最爱用list.removeIf(s-b.equals(s));// ✅ removeIf 内部自己处理了迭代安全方案四多线程场景——如果真的是多个线程在改同一个集合for-each 永远不安全改用并发容器CopyOnWriteArrayList读多写少或ConcurrentHashMap的 keySet 等。五、防坑总结遍历中要删元素用Iterator.remove()/removeIf/ 先收集后removeAll别用普通 for 按下标删除——删除会让后续元素前移下标错乱漏删要删就倒着遍历多线程共享集合必须用并发容器别指望 ArrayList 线程安全看到 ConcurrentModificationException 先看是不是遍历中修改单线程也会犯。下一篇P08 · 类型转换 ClassCastException

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号