You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历HashMap触发ConcurrentModificationException的解决问询

解决HashMap遍历删除时的ConcurrentModificationException问题

嘿,我太懂你这个痛点了!之前我也踩过同样的坑——用增强for循环遍历HashMap的时候直接调用orderIDHashMap.remove(),结果直接炸出ConcurrentModificationException。这是因为增强for循环底层依赖的Iterator会实时检测集合结构的变化,你绕开它直接修改集合,自然就触发异常了。

其实用Iterator完全能解决这个问题,而且操作起来也很简单,关键是要用Iterator自带的remove()方法,而不是集合本身的remove方法。下面给你具体的实现步骤:

1. 正确使用Iterator遍历并删除元素

先获取entrySet的Iterator,然后通过hasNext()和next()遍历,拿到每个键值对后做条件判断,符合条件时调用Iterator的remove():

Iterator<Map.Entry<String, Order>> iterator = orderIDHashMap.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry<String, Order> entry = iterator.next();
    // 提取键值对做条件判断
    String key = entry.getKey();
    Order order = entry.getValue();
    if (order.getOrderQuantity() == 0) {
        // 必须用Iterator的remove方法,不能用orderIDHashMap.remove(key)
        iterator.remove();
    }
}

这样做的原因是:Iterator的remove()方法会同步更新迭代器内部的状态,告诉它“我已经处理过这个元素的删除了”,不会触发并发修改的检测机制。

2. Java 8+ 更简洁的写法

如果你的项目用的是Java 8或更高版本,其实可以用removeIf()方法一行搞定,内部已经帮你处理了安全遍历和删除的逻辑,代码更清爽:

orderIDHashMap.entrySet().removeIf(entry -> entry.getValue().getOrderQuantity() == 0);

这个方法本质上也是用Iterator实现的,只是封装得更优雅,可读性也更强。

总结一下核心要点:遍历集合并修改结构时,一定要用Iterator提供的方法来操作,不要直接调用集合的修改方法,这样就能避免ConcurrentModificationException啦~

内容的提问来源于stack exchange,提问作者mynameisJEFF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:39:43