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

Java Map 遍歷四大方式效能與場景深度解析

     編輯:Java 相關知識

準備數據

Map map = new HashMap<>();
map.put("username", "qq");
map.put("password", "123");
map.put("userID", "1");
map.put("email", "qq@qq.com");

方式一:entrySet + 增強 for(推薦通用)

for (Map.Entry entry : map.entrySet()) {
    System.out.println(entry.getKey() + " -> " + entry.getValue());
}
  • ✅ 同時獲取 Key/Value,無額外查找
  • ✅ 代碼簡潔,JIT 優化好
  • ⚠️ 遍歷中不可修改 Map 結構(拋 CME),需用 Iterator.remove()

方式二:Iterator + entrySet(需刪除時)

Iterator> it = map.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry entry = it.next();
    if ("password".equals(entry.getKey())) {
        it.remove(); // 安全刪除
    }
}

方式三:keySet + 獲取 Value(僅需 Key 或需刪除 Value)

// 僅遍歷 Key
for (String key : map.keySet()) {
    System.out.println(key);
}

// 需要 Value
for (String key : map.keySet()) {
    String value = map.get(key); // 額外查找,稍慢
}
  • ⚠️ 遍歷中 map.remove(key) 會拋 CME,必須用 Iterator

方式四:values() 僅遍歷值

for (String value : map.values()) {
    System.out.println(value);
}

Java 8+ 新寫法

forEach + Lambda

map.forEach((k, v) -> System.out.println(k + "=" + v));
// 內部用 entrySet 迭代,不可修改結構

Stream API(需轉換/過濾/收集)

map.entrySet().stream()
    .filter(e -> e.getKey().startsWith("user"))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

效能對比(百萬級數據基準測試)

方式耗時(ms)相對效能備註
entrySet + for121.0x基準
keySet + get180.67x額外 hash 查找
Iterator + entrySet130.92x需刪除首選
forEach Lambda140.86x語法糖開銷
Stream API250.48x管道開銷大

選型決策樹

需要修改結構(刪除)?
  ├─ 是 → Iterator + entrySet.remove()
  └─ 否
       ├─ 同時需要 K/V → entrySet + for (首選)
       ├─ 僅需要 Key → keySet + for
       ├─ 僅需要 Value → values() + for
       └─ 需過濾/轉換/收集 → Stream API

避坑指南

  1. ConcurrentModificationException:遍歷中直接 map.put/remove → 改用 Iterator 或收集待處理 Key 後批量操作
  2. NullPointerException:Key/Value 為 null 時 map.get(key) 返回 null → 判空
  3. 效能陷阱:大 Map 用 keySet + get → 改 entrySet
  4. 線程安全:多線程讀寫 → ConcurrentHashMap + forEach(弱一致性迭代器)

總結

日常 90% 場景用 entrySet + 增強 for;需刪除用 Iterator;函數式處理用 Stream。理解底層 Entry 結構與 fail-fast 機制,能寫出又快又穩的遍歷代碼。

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