如何用Java创建不可变的Map
你好朋友,
在本教程中,我們將看到如何用Java創建不可變的Map。
–不可變的類或對象是什么意思?
–什么是不可變地圖?
–如何在Java中創建不可變的Map?
不變的類或對象是什么意思?
不可變的類或對象是創建后狀態不會改變的類或對象。例如Java中的String類是不可變的,因此,如果我們嘗試對String對象進行更改,它將創建一個新的String對象,但是當前對象的狀態不會改變。因此,如果實例化一個不可變的類,則一旦創建該實例,便無法更改其狀態。
什么是不可變地圖?
因此,考慮到以上對不可變的定義,不可變地圖是一種我們一旦創建就無法插入,更新或刪除元素的地圖,通常要求此類地圖具有不希望更改的內容,例如國家/地區這是貨幣。
如何在Java中創建不可變的Map?
我們可以通過多種方式創建不可變地圖。
–使用Collections.unmodifiableMap()
–使用Map.of()
–使用Map.ofEntries()
–使用Map.copyOf()
使用Collections.unmodifiableMap()
當我們使用Collections.unmodifiableMap(originalMap)時,它會在原始地圖上創建一個視圖,這樣我們就不能在該視圖上添加,刪除或更新,如果嘗試嘗試,則會出現UnSupportedOperation異常,但我們只能查看在原始地圖中。
我們仍然可以更新原始地圖,并且當我們更改原始地圖時,更改也會反映在視圖中。 因此這并不是真正意義上的創建不可變地圖。但是,我們仍然可以使用Collections.unmodifiableMap()創建不可變地圖。 對于第二個例子。
Map<String, Integer> originalMap1 = new HashMap<String, Integer>(); originalMap1.put("a", 1); originalMap1.put("b", 2);originalMap1.put("c", 3);Map<String, Integer> unmodifiableMap1 = Collections.unmodifiableMap(originalMap1);//unmodifiableMap1.put("d", 4);System.out.println("Size of originalMap1 before adding new data:"+originalMap1.size());System.out.println("Size of unmodifiableMap1 before adding new data:"+ unmodifiableMap1.size());originalMap1.put("e", 5);System.out.println("Size of originalMap1 after adding new data:"+originalMap1.size());System.out.println("Size of unmodifiableMap1 after adding new data:"+unmodifiableMap1.size());例子2
Map<String, Integer> originalMap2 = new HashMap<String, Integer>(); originalMap2.put("a", 1); originalMap2.put("b", 2);originalMap2.put("c", 3);Map<String, Integer> unmodifiableMap2 = Collections.unmodifiableMap(new HashMap<String, Integer>(originalMap2));//unmodifiableMap2.put("d", 4);System.out.println("Size of originalMap2 before adding new data:"+originalMap2.size());System.out.println("Size of unmodifiableMap2 before adding new data:"+ unmodifiableMap2.size());originalMap2.put("e", 5);System.out.println("Size of originalMap2 after adding new data:"+originalMap2.size());System.out.println("Size of unmodifiableMap2 after adding new data:"+unmodifiableMap2.size());在這里,我們沒有傳遞對原始地圖的引用,而是創建了一個HashMap的新實例,將其傳遞給原始的hashMap,然后將該HashMap的這個新實例傳遞給Collecitons.unmodifiableMap()方法。我們在此處獲得的“ unmodifiableMap2”是不可變的,因此即使您在原始哈希圖中進行了更改,它也不會反映在unmodifiableMap2實例中。
使用Map.of()
Map.of()是Java 9中引入的。以下示例是不言自明的。如果我們有少于等于10個鍵值對,則應使用此方法,因為如果看到Of()方法的重載,則最多有10個Of()方法的重載中允許的鍵值對。
static <K, V> Map<K, V> of() static <K, V> Map<K, V> of(K k1, V v1) static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2) . . . static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) Map<String, Integer> immutableMap1 = Map.of("a", 1, "b",2, "c",3);//immutableMap1.put("d", 4); //Will throw UnsupportedOperaironExceptionSystem.out.println("Size of immutableMap1:"+ immutableMap1.size());使用Map.ofEntries()
Java 9中也引入了Map.ofEntries(),當我們擁有超過10個鍵值對時,可以使用這種創建不可變映射的方法。
該方法的簽名如下:
static <K, V> Map<K, V> ofEntries(Entry<? extends K, ? extends V>... entries) Map<String, Integer> immutableMap2 = Map.ofEntries(entry("a",1),entry("b",2),entry("c",3));//immutableMap2.put("d", 4);System.out.println("Size of immutableMap2 :"+immutableMap2.size());使用Map.copyOf()
Java.10中引入了Map.copyOf()。
該方法的簽名如下:
static <K, V> Map<K, V> copyOf(Map<? extends K, ? extends V> map) Map<String, Integer> originalMap5 = new HashMap<String, Integer>(); originalMap5.put("a", 1); originalMap5.put("b", 2);originalMap5.put("c", 3);Map<String, Integer> immutableMap3 = Map.copyOf(originalMap5);//immutableMap3.put("d", 4);System.out.println("Size of originalMap5 before adding new data:"+originalMap5.size());originalMap5.put("e", 5);System.out.println("Size of originalMap5 after adding new data:"+originalMap5.size());System.out.println("Size of immutableMap3 after adding new data:"+immutableMap3.size()); package com.blogspot.javasolutionsguide.immutable_map_java_example;import static java.util.Map.entry;import java.util.Collections; import java.util.HashMap; import java.util.Map;/*** ImmutableMapTest.**/ public class ImmutableMapTest {public static void main( String[] args ) {//Unmodifiable Map<String, Integer> originalMap1 = new HashMap<String, Integer>(); originalMap1.put("a", 1); originalMap1.put("b", 2);originalMap1.put("c", 3);Map<String, Integer> unmodifiableMap1 = Collections.unmodifiableMap(originalMap1);//unmodifiableMap1.put("d", 4);System.out.println("Size of originalMap1 before adding new data:"+originalMap1.size());originalMap1.put("e", 5);System.out.println("Size of originalMap1 after adding new data:"+originalMap1.size());System.out.println("Size of unmodifiableMap1 after adding new data:"+unmodifiableMap1.size());//Example 2Map<String, Integer> originalMap2 = new HashMap<String, Integer>(); originalMap2.put("a", 1); originalMap2.put("b", 2);originalMap2.put("c", 3);Map<String, Integer> unmodifiableMap2 = Collections.unmodifiableMap(new HashMap<String, Integer>(originalMap2));//unmodifiableMap2.put("d", 4);System.out.println("Size of originalMap2 before adding new data:"+originalMap2.size());originalMap2.put("e", 5);System.out.println("Size of originalMap2 after adding new data:"+originalMap2.size());System.out.println("Size of unmodifiableMap2 after adding new data:"+unmodifiableMap2.size());//Example 3Map<String, Integer> immutableMap1 = Map.of("a", 1, "b",2, "c",3);//immutableMap1.put("d", 4); //Will throw UnsupportedOperaironExceptionSystem.out.println("Size of immutableMap1:"+ immutableMap1.size());//Example 4Map<String, Integer> immutableMap2 = Map.ofEntries(entry("a",1),entry("b",2),entry("c",3));//immutableMap2.put("d", 4);System.out.println("Size of immutableMap2 :"+immutableMap2.size());//Example 5Map<String, Integer> originalMap5 = new HashMap<String, Integer>(); originalMap5.put("a", 1); originalMap5.put("b", 2);originalMap5.put("c", 3);Map<String, Integer> immutableMap3 = Map.copyOf(originalMap5);//immutableMap3.put("d", 4);System.out.println("Size of originalMap5 before adding new data:"+originalMap5.size());originalMap5.put("e", 5);System.out.println("Size of originalMap5 after adding new data:"+originalMap5.size());System.out.println("Size of immutableMap3 after adding new data:"+immutableMap3.size());} }總結:
因此,在本教程中,我們了解了如何在Java中創建不可變映射。當我們知道將來映射的內容不會改變時,這非常有用。我們了解了JDK如何使用各種方法來創建不可變映射。
謝謝閱讀。 訂閱我們的博客以獲取更多此類有趣的帖子。
翻譯自: https://www.javacodegeeks.com/2020/03/how-to-create-immutabe-map-in-java.html
總結
以上是生活随笔為你收集整理的如何用Java创建不可变的Map的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学建筑设计的学生在买电脑时,最好选用什么
- 下一篇: 处理Java异常的10种最佳实践