最直接方式是用 keySet() 配合增强 for 循环;它返回仅含键的 Set,高效简洁,适合存在性检查等场景;需安全删除时改用 keySet().iterator()。

Java 中只遍历 HashMap 的所有键,最直接的方式是使用 keySet() 方法配合增强 for 循环。
用 keySet() + 增强 for 循环遍历键
keySet() 返回一个包含所有键的 Set 集合,不带值,也不含映射关系。适合只需要键本身(比如做存在性检查、打印键名、构造新键列表等)的场景。
- 代码简洁,可读性强
- 无需调用
get(),避免额外哈希查找开销 - 不能通过该集合修改原 Map 的结构(如添加/删除键值对),但可以安全遍历
示例:
Map<String, Integer> map = new HashMap<>();map.put("apple", 5);
map.put("banana", 3);
map.put("cherry", 7);
for (String key : map.keySet()) {
System.out.println("Key: " + key);
}
用 keySet() + 迭代器遍历键(支持安全删除)
如果需要在遍历过程中删除某些键,必须使用迭代器,否则会抛出 ConcurrentModificationException。
立即学习“Java免费学习笔记(深入)”;
- 调用
map.keySet().iterator()获取键的迭代器 - 使用
iterator.remove()删除当前键(同时也会删掉对应值) - 注意:不能用
map.remove(key)或map.keySet().remove(key)在循环中直接删
示例:
Iterator<String> keyIter = map.keySet().iterator();while (keyIter.hasNext()) {
String key = keyIter.next();
if (key.startsWith("a")) {
keyIter.remove(); // 安全删除
}
}
只遍历键时,别误用 entrySet 或 get()
如果目标只是取键,就不要绕路:
- 不用
entrySet()—— 它返回键值对,多拿了值,浪费资源 - 不用
map.get(key)—— 没必要查值,徒增哈希计算和潜在空指针风险 - 别把
keySet()当成Entry用,比如写entry.getValue()会编译报错
其他方式不推荐用于“只遍历键”
以下方法要么不适用,要么低效:
-
values():只返回值,完全拿不到键 -
entrySet():能拿到键,但必须调用entry.getKey(),属于冗余操作 - Lambda
forEach():虽可写map.keySet().forEach(System.out::println),但不如增强 for 直观,且无法中断或条件删除


















