用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以來,該領域有了巨大的進步。