当前位置: 首页 > 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.dtcms.com/a/270474.html

相关文章:

  • Android ViewModel机制与底层原理详解
  • N8N与Dify:自动化与AI的完美搭配
  • 零基础Qt 5 安装教程
  • 【深度学习新浪潮】什么是蛋白质反向折叠模型?
  • cad_recognition 笔记
  • 前端规范化设计详解
  • ORA-600 kokiasg1故障分析---惜分飞
  • [1-01-01].第50节:泛型 - 泛型的使用
  • Python标准库 bisect 模块
  • 云原生技术与应用-容器技术技术入门与Docker环境部署
  • 【洛谷题单】--顺序结构(一)
  • OSPFv3与OSPFv2不同点
  • eslint扁平化配置
  • Linux守护进程
  • 【ES实战】ES客户端线程量分析
  • java-网络编程
  • Java中数组与链表的性能对比:查询与增删效率分析
  • RabbitMQ第二章(RocketMQ的五大工作模式)
  • 【Linux服务器】-安装ftp与sftp服务
  • 数据结构:数组:合并数组(Merging Arrays)
  • 20 道 Node.js 高频面试题
  • Codeforces Round 868 (Div. 2) D. Unique Palindromes(1900,构造)
  • 深入企业内部的MCP知识(四):FastMCP装饰器与类方法:正确结合面向对象与MCP组件的实践指南
  • 4.权重衰减(weight decay)
  • MySQL-索引
  • SQL135 每个6/7级用户活跃情况
  • ${project.basedir}延申出来的Maven内置的一些常用属性
  • Python入门Day5
  • 嵌入式面试八股文100题(二)
  • 分库分表之实战-sharding-JDBC水平分库+水平分表配置实战