Java遍历HashMap时必须用Iterator.remove()安全删除,推荐entrySet()+Iterator;keySet()+Iterator适用于仅依赖key的场景;禁用for-each中map.remove()、values().iterator()删除及重复/前置调用it.remove();Java 8+可用removeIf简化操作。

Java 中不能在遍历 HashMap 时直接调用 map.remove(key) 删除元素,否则会抛出 ConcurrentModificationException。必须使用 Iterator 的 remove() 方法,且仅限在 next() 之后、下一次 next() 之前调用一次。
用 entrySet() + Iterator 安全删除
这是最常用、推荐的方式:获取键值对集合的迭代器,检查条件后调用 iterator.remove()。
- 调用
map.entrySet().iterator()获取Iterator<Map.Entry<K,V>> - 在循环中用
it.next()获取当前项,再通过entry.getKey()或entry.getValue()判断是否满足删除条件 - 满足条件时立即调用
it.remove(),该操作是唯一线程安全的删除方式
示例:
<pre>Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Integer> entry = it.next();
if (entry.getValue() > 1) {
it.remove(); // ✅ 安全删除
}
}
// 结果:{"a"=1}
</pre>
用 keySet() + Iterator 删除(只依赖 key)
如果删除逻辑只和 key 相关(比如 key 为空、为某前缀等),可用 keySet().iterator(),更轻量。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
- 获取
Iterator<K>,每次next()返回 key - 根据 key 判断是否删除,然后调用
it.remove() - 注意:此时删的是整个键值对,不是只删 key
示例:
<pre>Iterator<String> kit = map.keySet().iterator();
while (kit.hasNext()) {
String key = kit.next();
if ("b".equals(key)) {
kit.remove(); // ✅ 删除键为 "b" 的整个映射
}
}
</pre>
避免常见错误写法
以下写法都会导致异常或漏删/误删:
-
错:在 for-each 循环里调用
map.remove()—— 底层仍用 iterator,但没暴露 remove 接口 -
错:调用
it.remove()前没调用it.next(),或重复调用两次 —— 抛IllegalStateException -
错:用
values().iterator()删除 ——Collection.remove()不支持,会抛UnsupportedOperationException(因为 HashMap.values() 返回的是不可修改视图)
替代方案:removeIf(Java 8+)
如果使用 Java 8 或更高版本,可直接用 map.entrySet().removeIf(...),语义清晰且内部已做安全处理。
- 一行代码完成过滤删除:
map.entrySet().removeIf(e -> e.getValue() < 0); - 底层仍基于迭代器,但封装了 try-catch 和状态管理,不易出错
- 注意:该方法是
Collection.removeIf的默认实现,所有 Map 视图都支持

















