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

Java HashMap 遍歷三種主流寫法與效能比較

     編輯:Java 相關知識

三種遍歷模式

1. entrySet + Iterator(推薦通用)

Map map = new HashMap<>();
// ... put data ...
for (Iterator> it = map.entrySet().iterator(); it.hasNext(); ) {
    Map.Entry entry = it.next();
    String key = entry.getKey();
    Object val = entry.getValue();
    // 處理 key/val
}

✅ 單次遍歷同時取得 key/value,無額外 get() 查找。

2. keySet + Iterator(需額外 get)

for (Iterator it = map.keySet().iterator(); it.hasNext(); ) {
    String key = it.next();
    Object val = map.get(key); // 額外 hash 查找
}

⚠️ 兩次查找:一次 iterator,一次 get(),效能較差。

3. for-each 簡化寫法(Java 5+)

// entrySet 版
for (Map.Entry entry : map.entrySet()) {
    String key = entry.getKey();
    Object val = entry.getValue();
}

// keySet 版
for (String key : map.keySet()) {
    Object val = map.get(key);
}

語法糖,編譯後同 Iterator,可讀性最佳。

效能微基準測試參考

遍歷方式相對耗時 (100萬筆)備註
entrySet + for-each1.0x (基準)最佳平衡
entrySet + Iterator1.05x同級
keySet + for-each1.35x額外 get()
forEach (Java 8)1.1xLambda 開銷

Java 8+ 新寫法

// Lambda
map.forEach((k, v) -> System.out.println(k + "=" + v));

// Stream 平行處理大量資料
map.entrySet().parallelStream().forEach(entry -> {
    // 多執行緒處理
});

實務建議

  1. 預設使用 entrySet 遍歷,避免 keySet + get() 雙重查找。
  2. 若僅需 key 或 value,用 keySet() 或 values() 更語意清晰。
  3. 遍歷過程中需 刪除 元素,必須用 Iterator.remove(),直接呼叫 map.remove() 會拋 ConcurrentModificationException。
  4. 高併發環境改用 ConcurrentHashMap,其 forEach 為弱一致性遍歷,不拋異常。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved