使用Iterator的remove方法可安全删除元素,避免ConcurrentModificationException。

在Java中遍历集合的同时修改其元素,容易引发 ConcurrentModificationException 异常。这是因为大多数集合类(如 ArrayList、HashMap)采用“快速失败”(fail-fast)机制,在迭代过程中检测到结构被修改就会抛出异常。要安全地遍历并修改集合,需选择合适的方法。
使用 Iterator 的 remove 方法
这是最常见且推荐的方式,适用于删除元素的场景:
通过集合的 iterator() 方法获取迭代器 使用迭代器的 hasNext() 和 next() 遍历 调用 iterator.remove() 安全删除当前元素注意:不能直接调用集合的 remove() 方法,否则仍会触发异常。
示例代码:
List list = new ArrayList(Arrays.asList("a", "b", "c"));Iterator it = list.iterator();while (it.hasNext()) { String item = it.next(); if ("b".equals(item)) { it.remove(); // 安全删除 }}
使用支持并发的集合类
如果需要在多线程或复杂操作中修改集合,可选用 java.util.concurrent 包中的线程安全集合:
立即学习“Java免费学习笔记(深入)”;
CopyOnWriteArrayList:适合读多写少的场景,每次修改都会复制底层数组 ConcurrentHashMap:支持高并发的 Map 实现
这些集合允许在遍历时进行修改,不会抛出 ConcurrentModificationException。
示例:
List list = new CopyOnWriteArrayList(Arrays.asList("a", "b", "c"));for (String item : list) { if ("b".equals(item)) { list.remove(item); // 允许直接删除 }}
先收集再批量修改
若逻辑较复杂,或需要添加/替换元素,可分两步处理:
闪念贝壳
闪念贝壳是一款AI 驱动的智能语音笔记,随时随地用语音记录你的每一个想法。
218 查看详情
第一步:遍历原集合,记录需要删除或修改的元素 第二步:统一执行修改操作
这种方法逻辑清晰,避免了边遍历边修改的风险。
示例:
List list = new ArrayList(Arrays.asList("a", "b", "c"));List toRemove = new ArrayList();for (String item : list) { if ("b".equals(item)) { toRemove.add(item); }}list.removeAll(toRemove);
使用 removeIf 或 replaceAll(Java 8+)
Java 8 提供了更简洁的安全修改方式:
removeIf(Predicate):根据条件删除元素 replaceAll(UnaryOperator):替换所有元素
这些方法内部已处理并发问题,无需手动控制迭代器。
示例:
list.removeIf(item -> "b".equals(item));list.replaceAll(String::toUpperCase);
基本上就这些。选择哪种方式取决于你的具体需求:单线程下优先用 Iterator 或 removeIf;多线程环境考虑 CopyOnWriteArrayList 等并发集合。关键是避免在普通集合遍历时直接调用集合自身的增删方法。
以上就是在Java中如何安全地遍历并修改集合的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/986091.html
微信扫一扫
支付宝扫一扫