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

Java HashMap 初始化與遍歷完全指南:從雙大括號語法到 JDK 9 集合工廠

     編輯:Java 相關知識

HashMap 初始化多種寫法演進

1. 傳統逐項放入


Map map = new HashMap<>();
map.put("Name", "June");
map.put("QQ", "2572073701");

2. 雙大括號初始化(匿名內部類 + 實例初始化區塊)


Map map = new HashMap<>() {{
    put("Name", "June");
    put("QQ", "2572073701");
}};

原理:外層大括號建立繼承 HashMap 的匿名內部類,內層大括號為實例初始化區塊,建構子執行前自動執行。

隱患:

  • 產生額外 .class 檔案(如 Main$1.class),增加類別載入開銷
  • 持有外部類別參考,序列化時可能失敗(Gson、Jackson 等庫常見問題)
  • 效能約慢 10-15%(建立 1000 萬次測試:1217ms vs 1064ms)

修正:new HashMap<>(map) 複製為標準 HashMap 解決序列化問題。

3. Java 9+ 集合工廠方法(不可變集合)


// List
List list = List.of("A", "B", "C");
// Set
Set set = Set.of("X", "Y", "Z");
// Map(鍵值交替)
Map map = Map.of("k1", 1, "k2", 2, "k3", 3);
// Map.Entry 串聯(10 對以上)
Map map2 = Map.ofEntries(
    Map.entry("k1", 1), Map.entry("k2", 2) /*, ... */
);

特點:不可變、空值檢查、記憶體優化、執行緒安全。

4. Stream API 收集器(動態建構)


Map map = IntStream.rangeClosed(1, 10)
    .boxed()
    .collect(Collectors.toMap(
        i -> i,
        i -> "Value" + i,
        (v1, v2) -> v1, // 鍵衝突合併策略
        LinkedHashMap::new // 保持插入順序
    ));

HashMap 遍歷效能對決

方式一:entrySet 遍歷(推薦,單次查找)


for (Map.Entry entry : map.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
    // 處理邏輯
}

方式二:keySet 遍歷(雙重查找,效能較差)


for (String key : map.keySet()) {
    String value = map.get(key); // 額外 hash 查找
}

方式三:forEach (JDK 8+)


map.forEach((key, value) -> {
    // 處理邏輯
});

效能測試數據(1000 萬筆)

遍歷方式耗時 (ms)相對效能
entrySet 迭代器~450100% (基準)
forEach Lambda~48094%
keySet + get~72063%
Stream API~68066%

實務建議總結

  1. 初始化:靜態常用資料用 Map.of,動態資料用 new HashMap<>() + put 或 Stream 收集器
  2. 遍歷:優先 entrySet 或 forEach,避免 keySet + get
  3. 序列化:避免雙大括號語法,或事後 new HashMap<>(map) 轉換
  4. 並發:多執行緒環境改用 ConcurrentHashMap
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved