欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中直接初始化HashMap的方法實(shí)現(xiàn)

 更新時(shí)間:2025年06月27日 11:09:44   作者:1010n111  
在Java編程中,HashMap 是常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)鍵值對(duì),有時(shí)我們需要在創(chuàng)建 HashMap 的同時(shí)就初始化一些固定的、不會(huì)改變的值,然而,Java并沒(méi)有像某些動(dòng)態(tài)語(yǔ)言那樣的直接字面量初始化語(yǔ)法,所以本文給大家介紹了Java中直接初始化HashMap的方法,需要的朋友可以參考下

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.ofMap.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.ofImmutableMap 創(chuàng)建的 Map 是不可變的,若嘗試修改會(huì)拋出異常。
  • Collectors.toMapnull 值問(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)自定義注解處理器解析和處理注解

    這篇文章主要介紹了Spring實(shí)現(xiàn)自定義注解處理器解析和處理注解,注解在現(xiàn)代Java編程中扮演了至關(guān)重要的角色,無(wú)論是簡(jiǎn)化代碼、增強(qiáng)可讀性,還是將元數(shù)據(jù)與業(yè)務(wù)邏輯分離,注解都讓我們的代碼更加優(yōu)雅和靈活,需要的朋友可以參考下
    2024-10-10
  • Java垃圾回收之分代收集算法詳解

    Java垃圾回收之分代收集算法詳解

    今天小編就為大家分享一篇關(guān)于Java垃圾回收之分代收集算法詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • SpringBoot使用hutool-captcha實(shí)現(xiàn)驗(yàn)證碼生成與驗(yàn)證

    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
  • maven 隱式依賴(lài)引起的包沖突解決辦法

    maven 隱式依賴(lài)引起的包沖突解決辦法

    這篇文章主要介紹了maven 隱式依賴(lài)引起的包沖突解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • SSM spring Bean基礎(chǔ)配置實(shí)例詳解

    SSM spring Bean基礎(chǔ)配置實(shí)例詳解

    Bean是Spring框架中的一個(gè)基本單元,通常是一個(gè)普通的Java對(duì)象(POJO),但它被Spring容器管理,本文給大家介紹SSM spring Bean基礎(chǔ)配置,感興趣的朋友一起看看吧
    2025-06-06
  • java 如何讀取遠(yuǎn)程主機(jī)文件

    java 如何讀取遠(yuǎn)程主機(jī)文件

    這篇文章主要介紹了java 如何讀取遠(yuǎn)程主機(jī)文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • java抓取鼠標(biāo)事件和鼠標(biāo)滾輪事件示例

    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)用詳解

    這篇文章主要介紹了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配置詳解

    SpringBoot實(shí)戰(zhàn)之SSL配置詳解

    今天小編就為大家分享一篇關(guān)于SpringBoot實(shí)戰(zhàn)之SSL配置詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • Kafka簡(jiǎn)單客戶(hù)端編程實(shí)例

    Kafka簡(jiǎn)單客戶(hù)端編程實(shí)例

    這篇文章主要為大家詳細(xì)介紹了Kafka簡(jiǎn)單客戶(hù)端編程實(shí)例,利用Kafka的API進(jìn)行客戶(hù)端編程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評(píng)論