java17創(chuàng)建map的方式有幾種
在 Java 17中,創(chuàng)建 Map的方式有多種,主要取決于你使用的是 不可變 Map(Immutable Map)、可變 Map(Mutable Map),以及你希望使用 傳統(tǒng)方式、Java 9+ 引入的工廠方法,還是 Stream / Collectors 工具類構(gòu)建等。
下面我將為你全面梳理 Java 17 中創(chuàng)建 Map 的常見方式,并分類說明,包括 可變與不可變、傳統(tǒng)與現(xiàn)代寫法。
? 一、創(chuàng)建可變 Map(Mutable Map)(可增刪改)
指的是創(chuàng)建后可以 繼續(xù)修改(put、remove 等操作)的 Map,通常是 HashMap、LinkedHashMap、TreeMap等。
1.最傳統(tǒng)、最常用的方式:使用new HashMap<>()等
// 創(chuàng)建一個可變的 HashMap
Map<String, Integer> map1 = new HashMap<>();
map1.put("apple", 1);
map1.put("banana", 2);
// LinkedHashMap(保持插入順序)
Map<String, Integer> map2 = new LinkedHashMap<>();
map2.put("one", 1);
map2.put("two", 2);
// TreeMap(按鍵排序)
Map<String, Integer> map3 = new TreeMap<>();
map3.put("z", 26);
map3.put("a", 1);?? 特點:
- 可變(Mutable):支持增刪改查;
- 最基礎(chǔ)、最靈活,適用于絕大多數(shù)需要修改的場景;
- 沒有語法糖,需要手動
put。
? 二、創(chuàng)建不可變 Map(Immutable Map)(創(chuàng)建后不能修改)
指的是創(chuàng)建后 不能增刪改,適合配置、常量、映射關(guān)系固定等場景。
1.Java 9+ 推薦:使用Map.of()和Map.ofEntries()(簡潔、不可變)
? Java 9 引入,Java 17 完全支持!
(1)Map.of(K k1, V v1, K k2, V v2, ...)——適合少量鍵值對(最多10組)
// Java 9+ 提供的不可變 Map,最多支持 10 組鍵值對
Map<String, Integer> immutableMap1 = Map.of(
"apple", 1,
"banana", 2,
"cherry", 3
);
// 以下會編譯報錯:Map.of() 最多允許 10 個鍵值對
// Map<String, Integer> map = Map.of("a",1,"b",2,... up to 10);?? 限制:
- 鍵值對數(shù)量 不能超過 10 組;
- 鍵和值都不可為 null(會拋
NullPointerException); - 創(chuàng)建后 完全不可變(不能 put、remove、clear 等)。
(2)Map.ofEntries(Map.Entry<?, ?>...)或使用Map.entry(k, v)構(gòu)造更多鍵值對
當(dāng)你想創(chuàng)建 超過 10 組鍵值對,或者更靈活地構(gòu)造 Entry 時,可以用:
import java.util.Map;
Map<String, Integer> immutableMap2 = Map.ofEntries(
Map.entry("apple", 1),
Map.entry("banana", 2),
Map.entry("cherry", 3),
Map.entry("date", 4),
// 可以繼續(xù)添加,沒有 10 個的限制
Map.entry("elderberry", 5)
// ...理論上可以很多,但建議適度
);?? 特點:
- 鍵值對數(shù)量 無硬性限制(但別太夸張);
- 同樣 不可變(immutable),創(chuàng)建后不能修改;
- 鍵和值 不允許為 null(會拋異常);
- 更靈活,適合較復(fù)雜的初始化。
2.使用Collections.unmodifiableMap()包裝一個普通 Map(手動構(gòu)造后再設(shè)為不可變)
適用于:你先創(chuàng)建一個普通的 HashMap,然后希望包裝成 不可修改的視圖。
Map<String, Integer> mutableMap = new HashMap<>();
mutableMap.put("apple", 1);
mutableMap.put("banana", 2);
// 包裝為不可修改的 Map(視圖)
Map<String, Integer> unmodifiableMap = Collections.unmodifiableMap(mutableMap);
// 以下操作會拋 UnsupportedOperationException:
// unmodifiableMap.put("cherry", 3);?? 特點:
- 原始
mutableMap仍然可變(如果你保留了它的引用); - 但
unmodifiableMap是一個 只讀視圖,任何修改操作都會拋異常; - 適用于“構(gòu)造后轉(zhuǎn)不可變”的場景。
? 三、其他創(chuàng)建 Map 的方式(Java 17 也支持)
1.雙括號初始化(Double Brace Initialization)——不推薦 ??
這是一種利用匿名內(nèi)部類的寫法,可以快速初始化 Map,但:
- 不推薦使用!
- 會導(dǎo)致內(nèi)存泄漏(內(nèi)部類持有外部類引用);
- 代碼可讀性差;
- 性能與設(shè)計上均有問題;
// 不推薦?。?!僅作了解
Map<String, Integer> map = new HashMap<>() {{
put("apple", 1);
put("banana", 2);
}};? Java 社區(qū)普遍不推薦此寫法,尤其在正式項目中。
2.使用 Stream + Collectors.toMap()(適合動態(tài)構(gòu)建、轉(zhuǎn)換等場景)
適用于:你有一組數(shù)據(jù),想通過 流(Stream)處理后收集為 Map。
import java.util.*;
import java.util.stream.*;
List<String> fruits = Arrays.asList("apple", "banana", "cherry");
// 比如:將 List 轉(zhuǎn)為 Map<元素, 長度>
Map<String, Integer> map = fruits.stream()
.collect(Collectors.toMap(
fruit -> fruit, // Key: 水果名稱
fruit -> fruit.length() // Value: 名稱長度
));
// 結(jié)果如:{"apple"=5, "banana"=6, "cherry"=6}?? 特點:
- 非常靈活,適合 動態(tài)構(gòu)建 Map;
- 你可以控制 key / value 的生成邏輯;
- 如果 key 重復(fù),需處理沖突(或使用
Collectors.toMap(key, value, (v1,v2)->v1)合并函數(shù)); - 返回的是 可變 Map(通常是 HashMap)。
? 四、總結(jié):Java 17 創(chuàng)建 Map 的常見方式(表格概覽)
方式 | 可變性 | 是否支持 Null | 鍵值對數(shù)量限制 | 適用場景 | Java 版本 |
|---|---|---|---|---|---|
new HashMap<>() | ? 可變 | ? 支持 null | 無限制 | 通用可變 Map,最常用 | 所有版本 |
Map.of(k1,v1, ...) | ? 不可變 | ? 不支持 null | 最多 10 組 | 少量固定鍵值對,常量初始化 | Java 9+ |
Map.ofEntries(Map.entry(k,v)...) | ? 不可變 | ? 不支持 null | 無嚴(yán)格限制 | 較多鍵值對、靈活初始化 | Java 9+ |
Collections.unmodifiableMap(map) | ? 不可變(視圖) | ? 取決于原 Map | 無限制 | 將已有 Map 轉(zhuǎn)為不可變視圖 | 所有版本 |
Stream + Collectors.toMap() | ? 可變(通常是 HashMap) | ? 取決于邏輯 | 無限制 | 動態(tài)構(gòu)建、轉(zhuǎn)換數(shù)據(jù)為 Map | 所有版本 |
雙括號初始化 {{ put(...) }} | ? 可變 | ? 支持 null | 無限制 | 快速測試,不推薦生產(chǎn)使用 | 所有版本(但不推薦) |
? 推薦實踐(Java 17)
場景 | 推薦方式 |
|---|---|
需要可變 Map,后續(xù)增刪改查 | Map<String, Integer> map = new HashMap<>(); |
少量固定鍵值對(<=10),不可變(常量) | Map.of("k1", v1, "k2", v2) |
多個鍵值對(>10)、不可變 | Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...) |
動態(tài)構(gòu)建 Map(如從 List 轉(zhuǎn) Map) | list.stream().collect(Collectors.toMap(...)) |
將現(xiàn)有 Map 設(shè)為不可變 | Collections.unmodifiableMap(map) |
不推薦 | 雙括號初始化 {{ put(...) }} |
? 示例:Java 17 創(chuàng)建 Map 的推薦寫法
1. 可變 Map(最常用):
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);2. 不可變 Map(少量):
Map<String, Integer> immutableMap = Map.of("a", 1, "b", 2);3. 不可變 Map(較多鍵值對):
Map<String, Integer> immutableMap = Map.ofEntries(
Map.entry("a", 1),
Map.entry("b", 2),
Map.entry("c", 3)
);4. 動態(tài)構(gòu)建(比如從對象列表生成):
List<String> names = List.of("Alice", "Bob", "Charlie");
Map<String, Integer> nameLengths = names.stream()
.collect(Collectors.toMap(name -> name, String::length));? 總結(jié)回答(一句話)
在 Java 17 中,創(chuàng)建 Map 的方式有很多種,常見的包括:使用 new HashMap<>()(可變,最常用)、Map.of()和 Map.ofEntries()(Java 9+,不可變,簡潔)、Collections.unmodifiableMap()(包裝為不可變視圖)、以及 Stream + Collectors.toMap()(動態(tài)構(gòu)建)。你可以根據(jù)是否需要可變性、是否要不可變、鍵值對數(shù)量、代碼風(fēng)格等選擇最合適的方式。
到此這篇關(guān)于java17創(chuàng)建map的方式有幾種的文章就介紹到這了,更多相關(guān)java17創(chuàng)建map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot如何基于JWT實現(xiàn)單點登錄詳解
這篇文章主要介紹了spring boot如何基于JWT實現(xiàn)單點登錄詳解,用戶只需登錄一次就能夠在這兩個系統(tǒng)中進(jìn)行操作。很明顯這就是單點登錄(Single Sign-On)達(dá)到的效果,需要的朋友可以參考下2019-06-06
java集合類ArrayList和Vector的區(qū)別面試精講
這篇文章主要為大家介紹了java集合類ArrayList和Vector的區(qū)別面試全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
Java Elastic Job動態(tài)添加任務(wù)實現(xiàn)過程解析
這篇文章主要介紹了Java Elastic Job動態(tài)添加任務(wù)實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
基于Springboot疫苗接種行程管理系統(tǒng)的設(shè)計與實現(xiàn)
本文主要介紹了基于Springboot實現(xiàn)的疫苗接種行程管理系統(tǒng)的示例代碼,系統(tǒng)主要實現(xiàn)個人疫苗接種管理、行程管理、病史管理、風(fēng)險地區(qū)管理、核酸檢測報告結(jié)果上報、疫情新聞管理等功能,需要的可以參考一下2022-03-03
Spring?Boot?集成Elasticsearch模塊實現(xiàn)簡單查詢功能
本文講解了Spring?Boot集成Elasticsearch采用的是ES模板的方式實現(xiàn)基礎(chǔ)查詢,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2022-06-06
Spring ApplicationListener的使用詳解
這篇文章主要介紹了Spring ApplicationListener的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
SpringBoot使用ShardingSphere-Proxy的實現(xiàn)示例
ShardingSphere-Proxy是一個獨立的數(shù)據(jù)庫代理層,可以與SpringBoot集成,本文介紹了SpringBoot使用ShardingSphere-Proxy的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2025-02-02
Spring中任務(wù)調(diào)度之解讀@Scheduled和@Schedules注解的使用
這篇文章主要介紹了Spring中任務(wù)調(diào)度之解讀@Scheduled和@Schedules注解的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04

