java中遍历hashmap必须通过entryset()、keyset()或values()获取迭代器;推荐entryset()以同时访问键值对;遍历时修改需用iter.remove()避免concurrentmodificationexception。

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











