在Java中遍历Map并安全删除元素,必须使用Iterator的remove()方法;直接调用Map.remove()或在增强for循环中操作会抛出ConcurrentModificationException,推荐用entrySet().iterator()配合it.remove()或Java 8的removeIf方法。

在 Java 中遍历 Map 并安全删除元素,必须使用 Iterator 的 remove() 方法,直接调用 Map.remove() 或在增强 for 循环中操作会抛出 ConcurrentModificationException。使用 Map.Entry 遍历时,核心是通过 entrySet().iterator() 获取迭代器,再结合 entry.getKey() 和 entry.getValue() 判断条件后调用 iterator.remove()。
用 Iterator 遍历 entrySet 并移除
这是最标准、最安全的方式。获取 entrySet() 的迭代器,显式调用 remove():
- 不能用增强 for 循环(
for (Map.Entry<K,V> entry : map.entrySet()))直接调map.remove(entry.getKey()) - 必须用
Iterator<Map.Entry<K,V>>,并在满足条件时调it.remove() -
it.remove()是唯一允许在遍历中修改集合的操作,它与当前迭代位置强绑定,线程安全(单线程下)
示例代码(推荐写法)
比如移除 value 小于 10 的所有键值对:
Map<String, Integer> map = new HashMap<>();
map.put("a", 5);
map.put("b", 15);
map.put("c", 8);
Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Integer> entry = it.next();
if (entry.getValue() < 10) {
it.remove(); // ✅ 安全删除
}
}
执行后,map 剩余 {"b"=15}。
立即学习“Java免费学习笔记(深入)”;
替代方案:removeIf(Java 8+)
更简洁,内部仍基于迭代器,语义清晰且线程安全(非并发 map):
- 调用
map.entrySet().removeIf(entry -> entry.getValue() < 10) - 本质是封装了上述 iterator 模式,可读性高,推荐用于简单条件
- 注意:传入的 predicate 不能修改 entry 对象本身(如 setKey),否则行为未定义
常见错误和注意事项
以下操作都会导致异常或逻辑错误:
- 在增强 for 中调
map.remove(key)—— 触发ConcurrentModificationException - 用
keySet().iterator()删除时误删了其他 entry(虽可行,但不如 entrySet 直观) - 在 lambda 中捕获外部 map 并调
remove()(如removeIf(e -> { map.remove(e.getKey()); return false; }))—— 不安全且多余 - 多线程环境下,即使用了 iterator.remove(),若 map 本身不是线程安全实现(如
ConcurrentHashMap),仍需额外同步


















