entryset()遍历最高效,因直接访问内部entry节点,避免重复哈希计算和查找;推荐用增强for循环遍历map.entry,复杂逻辑再考虑stream。

用 Map.entrySet() 遍历 Map 是最推荐的方式,因为它避免了重复查找、减少哈希计算,一次拿到键和值,性能比分别调用 keySet() 或 values() 高得多。
为什么 entrySet() 更高效?
HashMap 等基于哈希表的实现中,每个 Entry 对象本身就封装了 key、value 和 next 引用。调用 entrySet() 返回的是内部 Entry 节点的视图(如 HashMap$EntrySet),遍历时直接访问已有结构;而用 keySet() 再逐个 get(key),会重新计算 hash、寻址、可能还要处理冲突——相当于做了两倍工作。
标准写法:增强 for + Map.Entry
这是最常用也最清晰的方式:
- 用
for (Map.Entry<k v> entry : map.entrySet())</k>直接迭代 - 用
entry.getKey()和entry.getValue()获取对应元素 - 若需修改 value,可直接调用
entry.setValue(newVal)(仅对支持修改的 Map 有效,如 HashMap)
示例:
map.put("a", 1); map.put("b", 2);
for (Map.Entry
System.out.println(e.getKey() + " → " + e.getValue());
}
进阶技巧:配合 Lambda 与 Stream
JDK 8+ 可结合 Stream 进行过滤、转换等操作,语义更明确:
map.entrySet().stream().filter(e -> e.getValue() > 10).forEach(e -> ...)- 转为新 Map:
map.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue() * 2)) - 注意:Stream 遍历本身有开销,纯遍历场景仍推荐传统 for 循环;复杂逻辑再考虑 Stream
避坑提醒:别误用 keySet() + get()
以下写法看似简洁,但效率差、还可能出错:
// ❌ 不推荐:触发 N 次 hash 查找for (String key : map.keySet()) {
Integer val = map.get(key); // 多余的查找!
}
// ⚠️ 更糟:若 key 为 null 或自定义类型且未重写 equals/hashCode,get() 可能返回 null 或错误值
除非你明确需要只操作 key(比如清空某些 key),否则应始终优先选 entrySet()。











