Java中不能直接用Iterator遍历Map,必须通过entrySet()、keySet()或values()获取可迭代视图;entrySet().iterator()支持安全删除,而keySet()和values()的迭代器不支持remove()。

Java 中不能直接用 Iterator 遍历 Map 本身,因为 Map 接口没有实现 Iterable,不支持直接 for-each 或 iterator() 调用。必须先获取它的“可迭代视图”,再用 Iterator 遍历键、值或键值对。
遍历 Map 的键值对(Entry)
最常用的方式是调用 map.entrySet(),它返回一个 Set<map.entry>></map.entry>,这个集合是可迭代的,能用 Iterator 安全遍历:
- 调用
map.entrySet().iterator()获取Iterator<map.entry>></map.entry> - 循环中用
next()取出每个Map.Entry对象 - 通过
entry.getKey()和entry.getValue()分别获取键和值
示例代码:
Map<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() 获取对应集合:
立即学习“Java免费学习笔记(深入)”;
-
map.keySet().iterator()→ 得到Iterator<K>,适合只处理键 -
map.values().iterator()→ 得到Iterator<V>,适合只处理值
注意:这两个视图的 Iterator 不支持修改操作(如 remove() 会抛 UnsupportedOperationException),但 entrySet() 的迭代器支持安全删除(调用 iter.remove() 会同步从原 Map 删除该键值对)。
遍历时修改 Map 的注意事项
使用 Iterator 遍历过程中,**只能通过迭代器自身的 remove() 方法删除当前元素**,否则会触发 ConcurrentModificationException:
- ✅ 正确:
iter.remove()—— 安全删除当前 entry - ❌ 错误:
map.remove(key)或map.put(...)—— 会破坏结构一致性
如果需要边遍历边增删多个元素,建议先收集待操作的 key 或 entry,遍历结束后统一处理。
替代写法:增强 for 循环更简洁
虽然问题问的是 Iterator,但实际开发中,用增强 for 更常见也更易读:
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
它的底层就是调用 entrySet().iterator(),语义等价,只是语法糖。


















