Java遍历HashMap应使用entrySet()、keySet()或values()获取迭代器,推荐entrySet()+Iterator方式;keySet()适合仅需键的场景;values()适用于只处理值的情况;注意线程不安全及遍历时修改异常。

Java 中遍历 HashMap 通过迭代器实现,核心是获取其 entrySet()、keySet() 或 values() 的迭代器,再用 Iterator 的 hasNext() 和 next() 方法逐个访问。不推荐直接对 HashMap 本身调用 iterator()(它没有该方法)。
用 entrySet() + Iterator 遍历键值对(最常用)
这是最推荐的方式,既能访问 key,也能访问 value,且性能好、类型安全。
说明:HashMap 的 entrySet() 返回一个 Set<map.entry>></map.entry>,这个 Set 支持迭代器。
示例代码:
立即学习“Java免费学习笔记(深入)”;
HashMap<String, Integer> map = new HashMap<>();
map.put("Alice", 25);
map.put("Bob", 30);
map.put("Charlie", 35);
Iterator<Map.Entry<String, Integer>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, Integer> entry = iter.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " → " + value);
}
用 keySet() + Iterator 遍历所有键
适合只需要 key 的场景,后续如需 value,可再调用 map.get(key),但注意可能触发额外哈希查找。
- 比
entrySet()多一次查找开销,小数据量影响不大,高频调用时建议优先选 entrySet - 适用于需要先处理 key(比如过滤、排序),再按需取值的逻辑
示例:
Iterator<String> keyIter = map.keySet().iterator();
while (keyIter.hasNext()) {
String key = keyIter.next();
System.out.println("Key: " + key + ", Value: " + map.get(key));
}
用 values() + Iterator 遍历所有值
当只关心 value,完全不需要 key 时使用。返回的是 Collection<v></v>,也支持迭代器。
- 无法反查对应 key,也不保证顺序(除非用 LinkedHashMap)
- 适合统计、聚合等纯值操作,例如求最大值、求和
示例:
Iterator<Integer> valIter = map.values().iterator();
while (valIter.hasNext()) {
System.out.println("Value: " + valIter.next());
}
注意事项与常见问题
使用迭代器遍历时需注意:
-
线程不安全:HashMap 本身非线程安全,遍历中若其他线程修改结构(add/remove),会抛
ConcurrentModificationException -
避免在遍历中直接调用 map.remove():应使用迭代器自身的
remove()方法安全删除当前项 -
泛型别省略:务必声明完整泛型类型(如
Iterator<map.entry integer>></map.entry>),否则编译警告或运行时类型错误 -
增强 for 循环本质也是迭代器:for-each 写法(
for (Map.Entry<string> e : map.entrySet())</string>)底层由迭代器实现,更简洁,但自定义控制(如条件跳过、手动 remove)仍需显式 Iterator


















