Java中遍历HashMap必须通过entrySet()、keySet()或values()获取迭代器;推荐entrySet()以同时访问键值对;遍历时修改需用iter.remove()避免ConcurrentModificationException。

Java 中不能直接用 Iterator 遍历 HashMap 本身,必须先获取它的键、值或键值对集合(如 entrySet()),再调用 iterator() 方法获得迭代器。
通过 entrySet() 获取键值对迭代器(推荐)
这是最常用、最高效的方式,能同时访问 key 和 value,避免重复查表:
- 调用
map.entrySet().iterator()得到Iterator<Map.Entry<K,V>> - 每次调用
next()返回一个Map.Entry对象 - 用
entry.getKey()和entry.getValue()分别获取键和值
HashMap<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
Iterator<Map.Entry<String, Integer>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<String, Integer> entry = iter.next();
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
遍历 keySet() 或 values() 的迭代器
如果只需要键或只需要值,可分别用 keySet().iterator() 或 values().iterator():
-
keySet().iterator()→Iterator<K>:适合只处理 key 的场景 -
values().iterator()→Iterator<V>:适合只处理 value 的场景 - 注意:
values()不保证顺序,且无法反查对应 key
使用增强 for 循环(底层仍用 Iterator)
虽然不是显式调用 Iterator,但语法更简洁,本质等价于手动迭代:
立即学习“Java免费学习笔记(深入)”;
-
for (Map.Entry<K,V> e : map.entrySet())是最常用的写法 - 编译后会被转为基于
iterator()的 while 循环,安全性与性能一致 - 若需在循环中删除元素,仍必须用显式
Iterator.remove()
遍历时修改 HashMap 的注意事项
HashMap 是快速失败(fail-fast)的,遍历中直接调用 map.put() 或 map.remove() 会抛 ConcurrentModificationException:
- 安全删除唯一方式:用迭代器自身的
iter.remove() - 该方法只能在
next()之后调用一次,且不支持添加 - 如需边遍历边增删复杂逻辑,考虑先收集待操作 key,再统一处理


















