用Java初始化HashMap

1.概述

在本教程中,我們將學習在Java中初始化HashMap各種方法。

我們將使用Java 8和Java 9。

進一步閱讀:

用Java比較兩個HashMap

了解如何比較Java中的兩個HashMap以及發現它們之間的差異

閱讀更多→

使用流使用地圖

了解如何結合Java Maps和Streams

閱讀更多→

2.靜態HashMap的靜態初始化器

我們可以使用static代碼塊初始化HashMap

public static Map<String, String> articleMapOne;

 static {

 articleMapOne = new HashMap<>();

 articleMapOne.put("ar01", "Intro to Map");

 articleMapOne.put("ar02", "Some article");

 }

這種初始化的優點是映射是可變的,但僅適用於靜態映射。因此,可以根據需要添加和刪除條目。

讓我們繼續進行測試:

@Test

 public void givenStaticMap_whenUpdated_thenCorrect() {



 MapInitializer.articleMapOne.put(

 "NewArticle1", "Convert array to List");



 assertEquals(

 MapInitializer.articleMapOne.get("NewArticle1"),

 "Convert array to List");

 }

我們還可以使用雙括號語法初始化地圖:

Map<String, String> doubleBraceMap = new HashMap<String, String>() {{

 put("key1", "value1");

 put("key2", "value2");

 }};

請注意,我們必須避免使用這種初始化技術,因為它在每次使用時都會創建一個匿名的額外類,保留對封閉對象的隱藏引用,並可能導致內存洩漏問題。

3.使用Java集合

如果我們需要使用一個條目創建一個單例不可變地圖, Collections.singletonMap()會非常有用:

public static Map<String, String> createSingletonMap() {

 return Collections.singletonMap("username1", "password1");

 }

請注意,這裡的地圖是不可變的,並且如果我們嘗試添加更多條目,它將拋出java.lang.UnsupportedOperationException.

我們還可以使用Collections.emptyMap():創建一個不變的空地圖Collections.emptyMap():

Map<String, String> emptyMap = Collections.emptyMap();

4. Java 8方式

在本節中,讓我們研究使用Java 8 Stream API.初始化地圖的方法Stream API.

4.1。使用Collectors.toMap()

讓我們使用二維String數組的Stream並將它們收集到地圖中:

Map<String, String> map = Stream.of(new String[][] {

 { "Hello", "World" },

 { "John", "Doe" },

 }).collect(Collectors.toMap(data -> data[0], data -> data[1]));

請注意這裡的鍵和值的數據類型Map是一樣的。

為了使其更通用,讓我們採用Objects數組並執行相同的操作:

 Map<String, Integer> map = Stream.of(new Object[][] {

 { "data1", 1 },

 { "data2", 2 },

 }).collect(Collectors.toMap(data -> (String) data[0], data -> (Integer) data[1]));

結果,我們將鍵的映射創建為String並將值的映射創建為Integer

4.2。使用Map.Entry

在這裡,我們將使用Map.Entry.的實例Map.Entry.這是我們擁有不同鍵和值類型的另一種方法。

首先,讓我們使用Entry接口的SimpleEntry實現:

Map<String, Integer> map = Stream.of(

 new AbstractMap.SimpleEntry<>("idea", 1),

 new AbstractMap.SimpleEntry<>("mobile", 2))

 .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

現在,讓我們使用SimpleImmutableEntry實現來創建地圖:

Map<String, Integer> map = Stream.of(

 new AbstractMap.SimpleImmutableEntry<>("idea", 1),

 new AbstractMap.SimpleImmutableEntry<>("mobile", 2))

 .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

4.3。初始化不可變地圖

在某些用例中,我們需要初始化一個不變的地圖。這可以通過包裝來完成Collectors.toMap()Collectors.collectingAndThen()

Map<String, String> map = Stream.of(new String[][] {

 { "Hello", "World" },

 { "John", "Doe" },

 }).collect(Collectors.collectingAndThen(

 Collectors.toMap(data -> data[0], data -> data[1]),

 Collections::<String, String> unmodifiableMap));

請注意,我們應避免使用Streams,進行此類初始化Streams,因為這可能會導致巨大的性能開銷,並且會創建大量垃圾對象來初始化地圖。

5. Java 9方式

Java 9在Map界面中帶有各種工廠方法,這些方法簡化了不可變地圖的創建和初始化。

讓我們繼續研究這些工廠方法。

5.1。 Map.of()

此工廠方法不帶參數,單個參數和變量參數:

Map<String, String> emptyMap = Map.of();

 Map<String, String> singletonMap = Map.of("key1", "value");

 Map<String, String> map = Map.of("key1","value1", "key2", "value2");

請注意,此方法最多僅支持10個鍵值對。

**5.2. Map.ofEntries()**

它類似於Map.of()但對鍵值對的數量沒有限制:

Map<String, String> map = Map.ofEntries(

 new AbstractMap.SimpleEntry<String, String>("name", "John"),

 new AbstractMap.SimpleEntry<String, String>("city", "budapest"),

 new AbstractMap.SimpleEntry<String, String>("zip", "000000"),

 new AbstractMap.SimpleEntry<String, String>("home", "1231231231")

 );

請注意,工廠方法會生成不可變的映射,因此任何突變都將導致UnsupportedOperationException.

而且,它們不允許空鍵或重複鍵。

現在,如果在初始化後需要可變的或正在增長的地圖,則可以創建Map接口的任何實現,並將這些不可變的地圖傳遞給構造函數:

Map<String, String> map = new HashMap<String, String> (

 Map.of("key1","value1", "key2", "value2"));

 Map<String, String> map2 = new HashMap<String, String> (

 Map.ofEntries(

 new AbstractMap.SimpleEntry<String, String>("name", "John"),

 new AbstractMap.SimpleEntry<String, String>("city", "budapest")));

6.使用番石榴

當我們研究了使用核心Java的方式時,讓我們繼續使用Guava庫初始化地圖:

Map<String, String> articles

 = ImmutableMap.of("Title", "My New Article", "Title2", "Second Article");

這將創建一個不變的地圖,並創建一個可變的地圖:

Map<String, String> articles

 = Maps.newHashMap(ImmutableMap.of("Title", "My New Article", "Title2", "Second Article"));

[ImmutableMap.of()](https://guava.dev/releases/23.0/api/docs/com/google/common/collect/ImmutableMap.html#of--)方法還具有重載版本,最多可以包含5對鍵值參數。這是帶有兩個參數對的示例:

ImmutableMap.of("key1", "value1", "key2", "value2");

7.結論

在本文中,我們探討了初始化Map的各種方法,特別是創建空的,單例的,不可變的和可變的地圖。正如我們所看到的,自Java 9以來,該領域有了巨大的進步。

與往常一樣,示例源代碼位於Github項目中。 Java 9示例位於此處,而Guava示例位於此處