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>></map.entry> - 在循环中用
it.next()获取当前项,再通过entry.getKey()或entry.getValue()判断是否满足删除条件 - 满足条件时立即调用
it.remove(),该操作是唯一线程安全的删除方式
示例:
<br>Map<string integer> map = new HashMap();<br>map.put("a", 1);<br>map.put("b", 2);<br>map.put("c", 3);<br><br>Iterator<map.entry integer>> it = map.entrySet().iterator();<br>while (it.hasNext()) {<br> Map.Entry<string integer> entry = it.next();<br> if (entry.getValue() > 1) {<br> it.remove(); // ✅ 安全删除<br> }<br>}<br>// 结果:{"a"=1}<br></string></map.entry></string>
用 keySet() + Iterator 删除(只依赖 key)
如果删除逻辑只和 key 相关(比如 key 为空、为某前缀等),可用 keySet().iterator(),更轻量。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 获取
Iterator<k></k>,每次next()返回 key - 根据 key 判断是否删除,然后调用
it.remove() - 注意:此时删的是整个键值对,不是只删 key
示例:
<br>Iterator<string> kit = map.keySet().iterator();<br>while (kit.hasNext()) {<br> String key = kit.next();<br> if ("b".equals(key)) {<br> kit.remove(); // ✅ 删除键为 "b" 的整个映射<br> }<br>}<br></string>
避免常见错误写法
以下写法都会导致异常或漏删/误删:
-
错:在 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() - 底层仍基于迭代器,但封装了 try-catch 和状态管理,不易出错
- 注意:该方法是
Collection.removeIf的默认实现,所有 Map 视图都支持
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










