Java中Iterator不能直接遍历HashMap键值对,需通过entrySet()、keySet()或values()获取可迭代集合;entrySet()最常用且高效,keySet()和values()分别适用于仅需键或值的场景;遍历时修改须用iterator.remove(),否则抛ConcurrentModificationException。

Java 中的 Iterator 不能直接遍历 HashMap 的键值对,因为 HashMap 本身不实现 Iterable 接口。但可以通过它的 entrySet()、keySet() 或 values() 方法获取可迭代的集合,再用 Iterator 遍历。
用 entrySet() + Iterator 遍历键值对
这是最常用的方式,能同时访问 key 和 value,且效率高(避免了重复查表)。
说明:entrySet() 返回 Set<map.entry>></map.entry>,而 Set 实现了 Iterable,所以可以调用 iterator()。
示例代码:
立即学习“Java免费学习笔记(深入)”;
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 20);
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " -> " + value);
}
用 keySet() + Iterator 遍历所有键
适合只需要 key、后续再通过 get() 获取 value 的场景。注意:如果 value 计算开销大或可能为 null,需谨慎使用 get()。
- 调用
map.keySet().iterator()得到Iterator<k></k> - 每次循环中用
map.get(key)拿 value(触发哈希查找) - 相比
entrySet(),多一次哈希定位,性能略低
用 values() + Iterator 遍历所有值
仅需 value 时可用,无法得知对应 key。返回的是 Collection<v></v> 的迭代器。
- 调用
map.values().iterator() - 迭代器元素类型是
V(如Integer),不是键值对 - 适用于统计、过滤等只关心值的场景
遍历时修改 HashMap 的注意事项
Iterator 是“快速失败”(fail-fast)的。在遍历过程中,除非使用 iterator.remove(),否则直接调用 map.put()、map.remove() 等会抛 ConcurrentModificationException。
- 安全删除:用
iterator.remove()(删除当前元素,只能调用一次) - 不支持添加:没有
iterator.add(),也不能在遍历时调用map.put() - 如需边遍历边增删,考虑先收集操作,遍历完再批量处理,或改用
ConcurrentHashMap


















