当前位置: 首页 > news >正文

java中list.remove(item); // 直接移除会导致ConcurrentModificationException

在 Java 中,如果你在遍历集合(如 List)的过程中直接使用 list.remove(item),是有可能抛出 ConcurrentModificationException 异常的。

为什么会抛出 ConcurrentModificationException?

这是因为在使用 增强型 for 循环(for-each) 或 Iterator 遍历时,Java 会检查集合是否被“结构性修改”(如添加、删除元素),如果检测到修改就会抛出异常。
错误示例:

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));for (String item : list) {if ("b".equals(item)) {list.remove(item); // 抛出 ConcurrentModificationException}
}

 正确做法:使用 Iterator
要在遍历时安全地移除元素,应该使用 Iterator 的 remove() 方法:

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {String item = iterator.next();if ("b".equals(item)) {iterator.remove(); // 安全地移除元素}
}

 iterator.remove() 是唯一允许在遍历过程中安全删除元素的方法。

 替代方案(Java 8+)

方式一:使用 removeIf()
如果你只是想根据条件移除元素,可以使用简洁的 removeIf():

list.removeIf(item -> "b".equals(item));

这行代码会移除所有满足条件的元素,内部已经处理了并发修改问题。

 多线程下修改 List

如果你是在 多线程环境中操作同一个 List,即使使用了 Iterator,也可能会出现并发问题。这时应使用线程安全的集合类:
推荐方式:
使用 Collections.synchronizedList
或者使用 CopyOnWriteArrayList(适用于读多写少场景)
示例:

List<String> list = new CopyOnWriteArrayList<>(Arrays.asList("a", "b", "c"));for (String item : list) {if ("b".equals(item)) {list.remove(item); // 在 CopyOnWriteArrayList 中是安全的}
}

在这里插入图片描述

http://www.lryc.cn/news/583347.html

相关文章:

  • 图像自动化处理初探:从拖拽上传到参数设置
  • 基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(5)失败用例截图与重试
  • 制作MikTex本地包可用于离线安装包
  • Synology Cloud Sync构建的企业级跨域数据中台
  • 前端性能优化:从之理论到实践的破局道
  • 【PTA数据结构 | C语言版】一元多项式求导
  • 使用 Docker 搭建 Rust Web 应用开发环境——AI教你学Docker
  • 图像处理中的凸包检测:原理与实现
  • 前端开发自动化设计详解
  • 两种方式清除已经保存的git账号密码
  • AI在垂直领域的深度应用:医疗、金融与自动驾驶的革新之路
  • 分治算法---快排
  • 深度帖:浏览器的事件循环与JS异步
  • Foundry智能合约测试设计流程
  • 【25软考网工】第十章 (3)网络冗余设计、广域网接入技术
  • 【一起来学AI大模型】PyTorch DataLoader 实战指南
  • 前端交互自定义封装类:“双回调自定义信息弹窗”
  • ClickHouse 时间范围查询:精准筛选「本月数据」
  • pytorch 自动微分
  • Git 详解:从概念,常用命令,版本回退到工作流
  • sqlplus表结构查询
  • 3.常⽤控件
  • 跨平台ROS2视觉数据流:服务器运行IsaacSim+Foxglove本地可视化全攻略
  • 【动手学深度学习】4.9. 环境和分布偏移
  • MyBatis之数据操作增删改查基础全解
  • tinyxml2 开源库与 VS2010 结合使用
  • MySQL8.0基于GTID的组复制分布式集群的环境部署
  • 如何通过配置gitee实现Claude Code的版本管理
  • SpringBoot校园疫情防控系统源码
  • Flink1.20.1集成Paimon遇到的问题