推荐直接用 for-each 遍历 entrySet(),因其仅遍历哈希桶一次、天然封装键值、性能比 keySet()+get() 快1.5–2倍、语义清晰且兼容所有 Map 实现。

推荐直接用 for-each 遍历 entrySet(),这是兼顾性能与可读性的最优解。
为什么 entrySet() + for-each 是首选
它只遍历底层哈希桶一次,每个 Map.Entry 对象天然封装了 key 和 value,无需额外哈希计算或查找。
- 性能上:比
keySet() + get()快约 1.5–2 倍(尤其在数据量 > 1000 时) - 可读性上:语义清晰,“遍历键值对”意图一目了然
- 通用性上:适用于所有 Map 实现(HashMap、LinkedHashMap、TreeMap 等)
只取 key 或只取 value 的情况
如果明确只需要 key 或 value,就分别用 keySet() 或 values() 遍历 —— 简洁、零冗余、无性能浪费。
- 遍历 key:
for (String key : map.keySet()) { ... } - 遍历 value:
for (Integer value : map.values()) { ... } - 注意:不要为取 value 而遍历 keySet 再调 get(),除非你后续还要用 key 做判断或处理
需要边遍历边删除时用 Iterator
for-each 循环中调用 map.remove(key) 会抛 ConcurrentModificationException;安全删除必须用迭代器。
- 正确写法:
Iterator> iter = map.entrySet().iterator(); while(iter.hasNext()) { ... iter.remove(); } - 这是唯一支持遍历中结构修改的标准方式
Lambda 和 Stream 要看场景
JDK 8+ 提供了 map.forEach((k, v) -> {...}) 和 map.entrySet().stream()...,但需注意:
-
forEach()语法更短,性能与 entrySet for-each 基本持平,适合简单逻辑 -
Stream在过滤、映射、并行处理等复杂操作中优势明显,但小数据量下有创建对象和函数调用开销,不建议只为遍历而用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











