在java中,遍历map时安全删除元素必须使用iterator的remove()方法、removeif()或concurrenthashmap;直接调用map.remove()会抛concurrentmodificationexception。

在 Java 中,直接在 for-each 或增强 for 循环中调用 Map.remove() 会抛出 ConcurrentModificationException,因为底层迭代器检测到结构被并发修改。安全删除必须借助迭代器自身的 remove() 方法,或使用支持并发修改的集合类型。
使用 Iterator 的 remove() 方法(推荐)
这是最通用、最安全的方式,适用于所有标准 Map 实现(如 HashMap、LinkedHashMap)。
关键点:必须通过 Iterator 获取元素并调用其 remove(),不能调用 Map.remove()。
- 先获取
entrySet().iterator() - 在
while (it.hasNext())循环中,用it.next()取出Map.Entry - 根据条件判断是否要删除,满足时立即调用
it.remove()
示例:
Map<string integer> map = new HashMap();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
Iterator<map.entry integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<string integer> entry = it.next();
if (entry.getValue() > 1) {
it.remove(); // ✅ 安全删除
}
}
// 结果:map = {"a"=1}</string></map.entry></string>
使用 removeIf()(Java 8+,简洁高效)
Collection.removeIf(Predicate) 内部已封装了安全的迭代逻辑,可直接用于 keySet()、values() 或 entrySet()。
- 删除满足条件的键:
map.keySet().removeIf(k -> k.startsWith("x")) - 删除满足条件的值:
map.values().removeIf(v -> v == null) - 删除满足条件的键值对:
map.entrySet().removeIf(e -> e.getValue()
注意:removeIf 是原子操作,无需手动管理迭代器,代码更清晰,性能也足够好。
使用 ConcurrentHashMap(多线程场景)
若需在多线程环境中边遍历边删除,ConcurrentHashMap 提供了线程安全的迭代能力:
- 它的
keySet()、values()、entrySet()返回的集合支持并发修改 - 允许在
for-each遍历中直接调用remove()(不会抛异常),但不保证看到最新修改(弱一致性) - 更稳妥的做法仍是配合
Iterator使用it.remove()
示例:
ConcurrentHashMap<string integer> concurrentMap = new ConcurrentHashMap();
concurrentMap.put("a", 1);
concurrentMap.put("b", 2);
// 安全(但语义上建议仍用 iterator)
for (Iterator<map.entry integer>> it = concurrentMap.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<string integer> e = it.next();
if (e.getValue() == 1) it.remove(); // ✅ 推荐
}</string></map.entry></string>
避免的写法(危险!)
以下操作都会触发 ConcurrentModificationException:
for (String key : map.keySet()) { if (someCond) map.remove(key); }for (Map.Entry<k> e : map.entrySet()) { if (someCond) map.remove(e.getKey()); }</k>- 在迭代过程中调用
map.clear()或map.putAll(...)
即使只删一个元素,只要不是通过当前迭代器的 remove(),就属于“结构修改”,会被检测并拒绝。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











