Map map = new HashMap<>();
map.put("1", "張三");
map.put("2", "李四");
map.put("3", "王五");
for (String key : map.keySet()) {
String value = map.get(key); // 額外一次 hash 查找
System.out.println("key=" + key + ", value=" + value);
}
get(),HashMap 需再次計算 hash、定位桶位Iterator> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = it.next();
System.out.println("key=" + entry.getKey() + ", value=" + entry.getValue());
}
it.remove())的唯一安全方式for (Map.Entry entry : map.entrySet()) {
System.out.println("key=" + entry.getKey() + ", value=" + entry.getValue());
}
entrySet() 返回 Set> ,Map.Entry 封裝鍵值對for (String val : map.values()) {
System.out.println("value=" + val);
}
Benchmark Mode Cnt Score Error Units
MapIteration.keySetGet avgt 10 12.34 ± 0.12 ms/op
MapIteration.entrySetIter avgt 10 8.21 ± 0.09 ms/op
MapIteration.entrySetForEach avgt 10 8.15 ± 0.08 ms/op
MapIteration.valuesOnly avgt 10 6.42 ± 0.07 ms/op
values() 約比 keySet()+get() 快 1.9 倍;entrySet 兩種寫法持平。
| 場景 | 推薦方式 | 理由 |
|---|---|---|
| 唯讀遍歷 key+value | entrySet + for-each | 最佳平衡 |
| 遍歷中需刪除符合條件項目 | Iterator + it.remove() | 唯一安全修改方式 |
| 只需 value | values() | 最快 |
| 只需 key | keySet() | 語意清晰 |
| 需保持插入順序 | LinkedHashMap + entrySet | 維護雙向鏈表 |
| 需排序順序 | TreeMap + entrySet | 紅黑樹有序 |
| 高併發讀寫 | ConcurrentHashMap + entrySet/forEach | 弱一致性迭代器 |
map.forEach((k, v) -> System.out.println(k + "=" + v));
// 內部實作同 entrySet 迭代,語法更簡潔,但無法 break/continue/return
日常開發首選 entrySet() + for-each;需刪除用 Iterator;只取值用 values()。理解 Map.Entry 封裝鍵值對的設計,能寫出更高效、更安全的集合操作代碼。