Java中直接初始化HashMap的方法實(shí)現(xiàn)
Java中直接初始化HashMap的方法
技術(shù)背景
在Java編程中,HashMap 是常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)鍵值對(duì)。有時(shí)我們需要在創(chuàng)建 HashMap 的同時(shí)就初始化一些固定的、不會(huì)改變的值。然而,Java并沒(méi)有像某些動(dòng)態(tài)語(yǔ)言那樣的直接字面量初始化語(yǔ)法,因此需要通過(guò)一些特定的方式來(lái)實(shí)現(xiàn)。
實(shí)現(xiàn)步驟
所有版本
若只需單個(gè)鍵值對(duì),可使用 Collections.singletonMap("key", "value")。
Java 9及更高版本
Java 9引入了一些工廠(chǎng)方法,簡(jiǎn)化了 Map 的創(chuàng)建:
Map.of:適用于最多10個(gè)元素的情況。
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,可以進(jìn)行復(fù)制,如 mutableMap = new HashMap<>(Map.of("a", "b"));。同時(shí),鍵和值都不能為 null。
Java 8及以下版本
- 使用匿名子類(lèi)的初始化器:
Map<String, String> myMap = new HashMap<String, String>() {{
put("a", "b");
put("c", "d");
}};
不過(guò),匿名子類(lèi)可能會(huì)引入一些不必要的行為,例如生成額外的類(lèi),增加內(nèi)存和磁盤(pán)空間消耗以及啟動(dòng)時(shí)間;在非靜態(tài)方法中,它會(huì)持有創(chuàng)建方法所在對(duì)象的引用,導(dǎo)致外部類(lèi)對(duì)象在創(chuàng)建的 Map 對(duì)象仍被引用時(shí)無(wú)法被垃圾回收。
- 使用函數(shù)進(jìn)行初始化:
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;
}
使用第三方庫(kù)(如Guava)
Guava的 ImmutableMap 可以實(shí)現(xiàn)類(lèi)似字面量的簡(jiǎn)潔初始化:
- 對(duì)于最多5個(gè)鍵值對(duì)的情況:
Map<String, String> test = ImmutableMap.of("k1", "v1", "k2", "v2");
- 對(duì)于更多鍵值對(duì)的情況,使用構(gòu)建器:
Map<String, String> test = ImmutableMap.<String, String>builder()
.put("k1", "v1")
.put("k2", "v2")
...
.build();
需要注意的是,Guava的 ImmutableMap 實(shí)現(xiàn)與Java的 HashMap 實(shí)現(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)點(diǎn)是不會(huì)創(chuàng)建匿名類(lèi)。
最佳實(shí)踐
- 若使用Java 9及以上版本,優(yōu)先使用
Map.of或Map.ofEntries方法,因?yàn)樗鼈兒?jiǎn)潔且能保證代碼的可讀性和性能。 - 若需要使用第三方庫(kù),Guava的
ImmutableMap是一個(gè)不錯(cuò)的選擇,特別是在需要不可變Map的場(chǎng)景下。 - 避免過(guò)度使用匿名子類(lèi)初始化,因?yàn)樗赡軙?huì)帶來(lái)不必要的性能開(kāi)銷(xiāo)和內(nèi)存占用。
常見(jiàn)問(wèn)題
- 匿名子類(lèi)初始化的問(wèn)題:匿名子類(lèi)會(huì)生成額外的類(lèi),增加內(nèi)存和磁盤(pán)空間消耗以及啟動(dòng)時(shí)間,還可能導(dǎo)致內(nèi)存泄漏。
- 不可變
Map的修改問(wèn)題:使用Map.of或ImmutableMap創(chuàng)建的Map是不可變的,若嘗試修改會(huì)拋出異常。 Collectors.toMap的null值問(wèn)題:Collectors.toMap依賴(lài)于Map.merge,不允許null值,否則會(huì)拋出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);
到此這篇關(guān)于Java中直接初始化HashMap的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java直接初始化HashMap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring實(shí)現(xiàn)自定義注解處理器解析和處理注解
這篇文章主要介紹了Spring實(shí)現(xiàn)自定義注解處理器解析和處理注解,注解在現(xiàn)代Java編程中扮演了至關(guān)重要的角色,無(wú)論是簡(jiǎn)化代碼、增強(qiáng)可讀性,還是將元數(shù)據(jù)與業(yè)務(wù)邏輯分離,注解都讓我們的代碼更加優(yōu)雅和靈活,需要的朋友可以參考下2024-10-10
SpringBoot使用hutool-captcha實(shí)現(xiàn)驗(yàn)證碼生成與驗(yàn)證
在springboot的登陸頁(yè)面中為了防止機(jī)器大規(guī)模注冊(cè),機(jī)器暴力破解數(shù)據(jù)密碼等危害,需要驗(yàn)證隨機(jī)生成的驗(yàn)證碼,本文主要介紹了SpringBoot使用hutool-captcha實(shí)現(xiàn)驗(yàn)證碼生成與驗(yàn)證,感興趣的可以了解一下2023-12-12
SSM spring Bean基礎(chǔ)配置實(shí)例詳解
Bean是Spring框架中的一個(gè)基本單元,通常是一個(gè)普通的Java對(duì)象(POJO),但它被Spring容器管理,本文給大家介紹SSM spring Bean基礎(chǔ)配置,感興趣的朋友一起看看吧2025-06-06
java抓取鼠標(biāo)事件和鼠標(biāo)滾輪事件示例
這篇文章主要介紹了java抓取鼠標(biāo)事件和鼠標(biāo)滾輪事件示例,需要的朋友可以參考下2014-05-05
SpringBoot集成WebSocket長(zhǎng)連接實(shí)際應(yīng)用詳解
這篇文章主要介紹了SpringBoot集成WebSocket長(zhǎng)連接實(shí)際應(yīng)用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
SpringBoot實(shí)戰(zhàn)之SSL配置詳解
今天小編就為大家分享一篇關(guān)于SpringBoot實(shí)戰(zhàn)之SSL配置詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02

