Java Map 循环:遍历方式与性能对比
Map 遍历的基础准备MapString, String map new HashMap();map.put(A, Apple);map.put(B, Banana);map.put(C, Cherry);2. 七种遍历方式详解2.1 entrySet for-each推荐最经典、最通用的方式。for (Map.EntryString, String entry : map.entrySet()) {String key entry.getKey();String value entry.getValue();System.out.println(key - value);}优点同时获取 key 和 value性能最佳只遍历一次缺点代码稍长但可读性好2.2 keySet for-each不推荐只取 key再通过 key 获取 value。for (String key : map.keySet()) {String value map.get(key);System.out.println(key - value);}缺点需要两次查找迭代 getHashMap 中性能约为 entrySet 的一半。2.3 只遍历 valuefor (String value : map.values()) {System.out.println(value);}适用场景只需要 value不需要 key。2.4 Iterator entrySet适合删除操作IteratorMap.EntryString, String iter map.entrySet().iterator();while (iter.hasNext()) {Map.EntryString, String entry iter.next();if (B.equals(entry.getKey())) {iter.remove(); // 安全删除}}优点遍历过程中可以安全删除元素。2.5 forEach (Java 8 Lambda)map.forEach((key, value) - System.out.println(key - value));优点代码简洁优雅缺点不能修改外部非 final 变量需要变通不支持break/return提前终止必须抛出异常。2.6 Stream API函数式处理map.entrySet().stream().filter(e - e.getKey().startsWith(A)).forEach(e - System.out.println(e.getKey() - e.getValue()));适用场景需要链式过滤、映射、聚合等操作。2.7 仅 JDK 8 的 compute / merge 等函数式计算虽然不属于“遍历”但适用于边遍历边计算新值。map.replaceAll((key, value) - value.toUpperCase());3. 性能对比HashMap 测试方式100万条目耗时(ms)推荐指数entrySet for-each32⭐⭐⭐⭐⭐Iterator entrySet33⭐⭐⭐⭐forEach (Lambda)34⭐⭐⭐⭐⭐Stream API38⭐⭐⭐⭐keySet get67⭐⭐测试环境JDK 17, HashMapString,String, 100万条目平均取三次。4. 并发场景下的遍历4.1 ConcurrentHashMapConcurrentHashMapString, String cmap new ConcurrentHashMap();// 使用与 HashMap 相同的遍历方式但弱一致性cmap.forEach((k, v) - System.out.println(k));4.2 遍历时修改避免 ConcurrentModificationException普通 HashMap只能用Iterator.remove()ConcurrentHashMap支持安全遍历但无法保证立即看到最新数据// 错误示范会抛异常for (String key : map.keySet()) {if (condition) map.remove(key);}// 正确方式Iterator 删除IteratorMap.EntryString,String it map.entrySet().iterator();while(it.hasNext()){if(condition) it.remove();}