Java中直接初始化HashMap的方法實現(xiàn)
Java中直接初始化HashMap的方法
技術背景
在Java編程中,HashMap 是常用的數(shù)據(jù)結構,用于存儲鍵值對。有時我們需要在創(chuàng)建 HashMap 的同時就初始化一些固定的、不會改變的值。然而,Java并沒有像某些動態(tài)語言那樣的直接字面量初始化語法,因此需要通過一些特定的方式來實現(xiàn)。
實現(xiàn)步驟
所有版本
若只需單個鍵值對,可使用 Collections.singletonMap("key", "value")。
Java 9及更高版本
Java 9引入了一些工廠方法,簡化了 Map 的創(chuàng)建:
Map.of:適用于最多10個元素的情況。
Map<String, String> test1 = Map.of(
"a", "b",
"c", "d"
);
Map.ofEntries:適用于任意數(shù)量元素的情況。
import static java.util.Map.entry;
Map<String, String> test2 = Map.ofEntries(
entry("a", "b"),
entry("c", "d")
);
注意,上述方法創(chuàng)建的 Map 是不可變的。若需要可變的 Map,可以進行復制,如 mutableMap = new HashMap<>(Map.of("a", "b"));。同時,鍵和值都不能為 null。
Java 8及以下版本
- 使用匿名子類的初始化器:
Map<String, String> myMap = new HashMap<String, String>() {{
put("a", "b");
put("c", "d");
}};
不過,匿名子類可能會引入一些不必要的行為,例如生成額外的類,增加內(nèi)存和磁盤空間消耗以及啟動時間;在非靜態(tài)方法中,它會持有創(chuàng)建方法所在對象的引用,導致外部類對象在創(chuàng)建的 Map 對象仍被引用時無法被垃圾回收。
- 使用函數(shù)進行初始化:
Map<String, String> myMap = createMap();
private static Map<String, String> createMap() {
Map<String,String> myMap = new HashMap<String,String>();
myMap.put("a", "b");
myMap.put("c", "d");
return myMap;
}
使用第三方庫(如Guava)
Guava的 ImmutableMap 可以實現(xiàn)類似字面量的簡潔初始化:
- 對于最多5個鍵值對的情況:
Map<String, String> test = ImmutableMap.of("k1", "v1", "k2", "v2");
- 對于更多鍵值對的情況,使用構建器:
Map<String, String> test = ImmutableMap.<String, String>builder()
.put("k1", "v1")
.put("k2", "v2")
...
.build();
需要注意的是,Guava的 ImmutableMap 實現(xiàn)與Java的 HashMap 實現(xiàn)不同,它是不可變的,并且不允許 null 鍵和值。
Java 8使用Stream和Collectors
import static java.util.stream.Collectors.toMap;
import java.util.AbstractMap.SimpleEntry;
Map<String, String> myMap = Stream.of(
new SimpleEntry<>("key1", "value1"),
new SimpleEntry<>("key2", "value2"),
new SimpleEntry<>("key3", "value3"))
.collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue));
這種方法的優(yōu)點是不會創(chuàng)建匿名類。
最佳實踐
- 若使用Java 9及以上版本,優(yōu)先使用
Map.of或Map.ofEntries方法,因為它們簡潔且能保證代碼的可讀性和性能。 - 若需要使用第三方庫,Guava的
ImmutableMap是一個不錯的選擇,特別是在需要不可變Map的場景下。 - 避免過度使用匿名子類初始化,因為它可能會帶來不必要的性能開銷和內(nèi)存占用。
常見問題
- 匿名子類初始化的問題:匿名子類會生成額外的類,增加內(nèi)存和磁盤空間消耗以及啟動時間,還可能導致內(nèi)存泄漏。
- 不可變
Map的修改問題:使用Map.of或ImmutableMap創(chuàng)建的Map是不可變的,若嘗試修改會拋出異常。 Collectors.toMap的null值問題:Collectors.toMap依賴于Map.merge,不允許null值,否則會拋出NullPointerException。若需要處理null值,可以使用自定義收集器。
Map<String, String> myMap = Stream.of(
new SimpleEntry<>("key1", "value1"),
new SimpleEntry<>("key2", (String) null),
new SimpleEntry<>("key3", "value3"),
new SimpleEntry<>("key1", "value1updated"))
.collect(HashMap::new,
(map, entry) -> map.put(entry.getKey(),
entry.getValue()),
HashMap::putAll);
到此這篇關于Java中直接初始化HashMap的方法實現(xiàn)的文章就介紹到這了,更多相關Java直接初始化HashMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot使用hutool-captcha實現(xiàn)驗證碼生成與驗證
在springboot的登陸頁面中為了防止機器大規(guī)模注冊,機器暴力破解數(shù)據(jù)密碼等危害,需要驗證隨機生成的驗證碼,本文主要介紹了SpringBoot使用hutool-captcha實現(xiàn)驗證碼生成與驗證,感興趣的可以了解一下2023-12-12
SpringBoot集成WebSocket長連接實際應用詳解
這篇文章主要介紹了SpringBoot集成WebSocket長連接實際應用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06

