推荐使用 Iterator 配合 entrySet() 遍历 HashMap,效率最高且支持安全删除;entrySet() 返回键值对视图,通过 next().getKey()/getValue() 获取键值,删除须用 it.remove(),禁用 map.remove()。

遍历 HashMap 时,推荐使用 Iterator 配合 entrySet(),这是最高效、最常用的方式,既能安全获取键值对,又支持遍历时删除元素。
用 Iterator 遍历 entrySet(推荐)
HashMap 的 entrySet() 返回一个包含所有键值对(Map.Entry)的 Set 视图,它支持迭代器,且性能优于 keySet() + get() 组合。
- 调用
map.entrySet().iterator()获取 Iterator - 用
hasNext()判断是否还有元素 - 用
next()获取下一个Map.Entry<K,V> - 通过
entry.getKey()和entry.getValue()分别取键和值
示例代码:
map.put("a", 1);
map.put("b", 2);
Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Integer> entry = it.next();
System.out.println(entry.getKey() + " → " + entry.getValue());
}
遍历时安全删除元素
如果需要在遍历中删除满足条件的条目,必须使用 Iterator 的 remove() 方法,不能直接调用 map.remove(key),否则会抛出 ConcurrentModificationException。
- 在
it.next()后、下一次it.hasNext()前调用it.remove() - 每次
remove()只删掉上一次next()返回的那项
例如:删除所有 value 小于 2 的条目
Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();while (it.hasNext()) {
Map.Entry<String, Integer> e = it.next();
if (e.getValue() < 2) {
it.remove(); // ✅ 安全删除
}
}
其他 Iterator 遍历方式(不推荐用于 HashMap)
虽然也能用 keySet().iterator() 或 values().iterator(),但有明显局限:
-
keySet().iterator():只能拿到 key,要取 value 得再调map.get(key),多一次哈希查找,效率低 -
values().iterator():只能访问 value,完全丢失 key 信息,适用场景极窄 - 三者都不支持「同时获取键和值」的原子操作,entrySet 是唯一兼顾效率与功能的选择
注意点与常见错误
- Iterator 不是线程安全的;多线程环境下需额外同步(如用
Collections.synchronizedMap()或ConcurrentHashMap) - 不要在循环体中多次调用
it.next()(比如写成it.next().getKey()和it.next().getValue()),这会跳过元素 - Iterator 一旦创建,其行为基于创建时刻的 map 快照;后续 map 的结构性修改(如 put/remove)可能导致迭代器失效(fail-fast)


















