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 integer>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<string integer> entry = iter.next();
System.out.println(entry.getKey() + " -> " + entry.getValue());
}</string></map.entry></string>
只遍历键或只遍历值
如果只需要键或值,也可以分别用 keySet() 或 values() 获取对应集合:
-
map.keySet().iterator()→ 得到Iterator<k></k>,适合只处理键 -
map.values().iterator()→ 得到Iterator<v></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());
}</string>
它的底层就是调用 entrySet().iterator(),语义等价,只是语法糖。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











