最推荐用entrySet()+增强for循环遍历Map,可一次性获取key和value,避免重复哈希查找,性能比keySet+get高约10%;仅需key或value时分别用keySet()或values();需删除元素时必须用Iterator的remove()方法。

最直接高效的方式是用 entrySet() 遍历,一次性拿到 key 和 value,避免重复查表。
推荐:用 entrySet() + 增强 for 循环
这是日常开发中最常用、性能最优的全量遍历方式。entrySet() 返回的是 Set<map.entry>></map.entry>,每个 Entry 对象封装了 key 和 value。
- 无需额外调用
map.get(key),省去一次哈希查找,效率比 keySet + get 高约 10% - 代码简洁清晰,语义明确
示例:
Mapmap.put("苹果", 10); map.put("香蕉", 20);
for (Map.Entry
System.out.println("key=" + entry.getKey() + ", value=" + entry.getValue());
}
需要只处理 key 或只处理 value 时
如果业务只要键或只要值,用 keySet() 或 values() 单独遍历更合适,不浪费资源。
- 遍历所有 key:
for (String key : map.keySet()) { ... } - 遍历所有 value:
for (Integer value : map.values()) { ... }
注意:这两种方式不能同时拿到 key 和 value,适合单维度操作场景。
需要在遍历时删除元素?用 Iterator
增强 for 循环不支持边遍历边 remove,否则抛 ConcurrentModificationException。安全删除必须用迭代器。
- 删 key-value 对:
Iterator<map.entry>> it = map.entrySet().iterator();</map.entry> - 删指定 key:
Iterator<k> it = map.keySet().iterator();</k>
调用 it.remove() 是唯一线程安全的删除方式。
不推荐:keySet() + get(key) 组合
虽然写起来像这样:
for (String key : map.keySet()) {Integer value = map.get(key);
System.out.println(key + "=" + value);
}
但每次 get(key) 都会重新计算 hash、定位桶、比较 key,带来明显开销。数据量大时性能差距显著,应避免。


















