首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Map 遍歷四大方式完整對比:keySet、entrySet、Iterator、values 適用場景與效能

     編輯:Java 相關知識

準備資料

Map map = new HashMap<>();
map.put("1", "張三");
map.put("2", "李四");
map.put("3", "王五");

方式一:keySet + get(key) —— 最直觀,但效能較差

for (String key : map.keySet()) {
    String value = map.get(key);  // 額外一次 hash 查找
    System.out.println("key=" + key + ", value=" + value);
}
  • 優點:語法簡單,適合只需 key 或偶爾取 value
  • 缺點:每次迴圈額外 get(),HashMap 需再次計算 hash、定位桶位
  • 效能:O(N) 但常數因子較大

方式二:entrySet + Iterator —— 經典、通用

Iterator> it = map.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry entry = it.next();
    System.out.println("key=" + entry.getKey() + ", value=" + entry.getValue());
}
  • 優點:單次遍歷同時取得 key/value,無額外查找
  • 缺點:程式碼較冗長
  • 適用:需在遍歷中 移除元素(it.remove())的唯一安全方式

方式三:entrySet + for-each —— 推薦日常使用

for (Map.Entry entry : map.entrySet()) {
    System.out.println("key=" + entry.getKey() + ", value=" + entry.getValue());
}
  • 優點:語法簡潔、效能最佳(JIT 易優化)、不可變遍歷語意明確
  • 原理:entrySet() 返回 Set>,Map.Entry 封裝鍵值對

方式四:values() —— 僅需值時最快

for (String val : map.values()) {
    System.out.println("value=" + val);
}
  • 優點:完全跳過 key,記憶體與 CPU 開銷最小
  • 缺點:無法取得 key

效能微基準參考(JMH,100萬筆資料,HashMap)

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+valueentrySet + for-each最佳平衡
遍歷中需刪除符合條件項目Iterator + it.remove()唯一安全修改方式
只需 valuevalues()最快
只需 keykeySet()語意清晰
需保持插入順序LinkedHashMap + entrySet維護雙向鏈表
需排序順序TreeMap + entrySet紅黑樹有序
高併發讀寫ConcurrentHashMap + entrySet/forEach弱一致性迭代器

Java 8+ 新寫法:forEach + Lambda

map.forEach((k, v) -> System.out.println(k + "=" + v));
// 內部實作同 entrySet 迭代,語法更簡潔,但無法 break/continue/return

總結

日常開發首選 entrySet() + for-each;需刪除用 Iterator;只取值用 values()。理解 Map.Entry 封裝鍵值對的設計,能寫出更高效、更安全的集合操作代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved