Java遍历Map的keySet和values时,keySet()返回键的Set集合,适合通过键获取值;values()返回值的Collection集合,适合仅需值的场景;需删除元素时应使用Iterator遍历keySet并调用remove()。

Java 中遍历 Map 的 keySet 和 values 是常见操作,核心在于理解 keySet() 返回的是键的集合,values() 返回的是值的集合,两者都支持增强 for 循环和迭代器方式。
用增强 for 循环遍历 keySet
keySet() 返回一个 Set
- 直接遍历 keySet,再通过 get(key) 拿值
- 注意:若 Map 允许 null 键(如 HashMap),需判断 key 是否为 null,避免空指针
- 示例代码:
map.put("a", 1); map.put("b", 2);
for (String key : map.keySet()) {
Integer value = map.get(key); // 安全,因 key 来自当前 map
System.out.println(key + " → " + value);
}
用增强 for 循环遍历 values
values() 返回 Collection
- 无法反查键,也不能保证顺序(除非是 LinkedHashMap)
- 允许重复值,所以 values 集合可能含重复元素
- 示例代码:
System.out.println("value: " + value);
}
用迭代器遍历更灵活(尤其需删除时)
增强 for 本质是迭代器语法糖,但显式使用 Iterator 可在遍历时安全删除元素。
立即学习“Java免费学习笔记(深入)”;
- 遍历 keySet 时删除:用 keySet().iterator()
- 遍历 values 时删除:不能直接删(values() 返回的集合不支持 remove()),应通过 key 删除
- 推荐写法(安全删除键值对):
while (keyIter.hasNext()) {
String key = keyIter.next();
if (key.equals("a")) {
keyIter.remove(); // 安全删除
}
}
性能与选择建议
多数情况下优先用增强 for,简洁且 JVM 优化好;若需边遍历边修改结构,必须用迭代器。
- keySet 遍历 + get():时间复杂度平均 O(1) 每次访问,整体 O(n)
- values 遍历:避免用于查找或去重,因为无键上下文
- 如果既要键又要值,更高效的方式是遍历 entrySet(),避免反复 hash 查找


















