Java中如何實現(xiàn)不可變Map詳解
前言
有時最好不允許修改 java.util.Map, 例如跨線程共享只讀數(shù)據(jù)。為此,我們可以使用Unmodifiable Map或Immutable Map。
在這個快速教程中,我們將看到它們之間的區(qū)別。然后,我們將介紹可以創(chuàng)建不可變Map的各種方法。
下面話不多說了,來一起看看詳細(xì)的介紹吧
不可修改與不可變
Unmodifiable Map其實是一個可以修改的map的包裝器,不允許直接修改它。
Map<String, String> mutableMap = new HashMap<>();
mutableMap.put("USA", "North America");
Map<String, String> unmodifiableMap = Collections.unmodifiableMap(mutableMap);
assertThrows(UnsupportedOperationException.class,
() -> unmodifiableMap.put("Canada", "North America"));
但是包裝器里面底層的可變Map仍然可以改變,修改也反映在不可修改的Map中:
mutableMap.remove("USA");
assertFalse(unmodifiableMap.containsKey("USA"));
mutableMap.put("Mexico", "North America");
assertTrue(unmodifiableMap.containsKey("Mexico"));
另一方面,不可變Map包含其自己的私有數(shù)據(jù),是不允許對其進行修改。因此,一旦創(chuàng)建了不可變Map的實例,數(shù)據(jù)就不會以任何方式改變。
Guava不變Map
Guava提供了每個java.util的不可變版本。使用 ImmutableMap 映射 。每當(dāng)我們嘗試修改它時,它都會拋出 UnsupportedOperationException。
由于它包含自己的私有數(shù)據(jù),因此在更改原始地圖時,此數(shù)據(jù)不會更改。
我們現(xiàn)在將討論創(chuàng)建ImmutableMap實例的各種方法 。
1. 使用copyOf()方法:
首先,讓我們使用ImmutableMap.copyOf() 方法,該方法返回原始Map中所有條目的副本:
ImmutableMap<String, String> immutableMap = ImmutableMap.copyOf(mutableMap);
assertTrue(immutableMap.containsKey("USA"));
它不能直接修改,但是可以改變其內(nèi)部可變的Map:
assertThrows(UnsupportedOperationException.class,
() -> immutableMap.put("Canada", "North America"));
mutableMap.remove("USA");
assertTrue(immutableMap.containsKey("USA"));
mutableMap.put("Mexico", "North America");
assertFalse(immutableMap.containsKey("Mexico"));
2.使用builder()方法
我們還可以使用 ImmutableMap.builder() 方法創(chuàng)建原始Map中所有條目的副本。
此外,我們可以使用此方法添加原始Map中不存在的其他條目:
ImmutableMap<String, String> immutableMap = ImmutableMap.<String, String>builder()
.putAll(mutableMap)
.put("Costa Rica", "North America")
.build();
assertTrue(immutableMap.containsKey("USA"));
assertTrue(immutableMap.containsKey("Costa Rica"));
3. 使用of()
最后,我們可以使用ImmutableMap.of() 方法創(chuàng)建一個不可變的Map,其中包含動態(tài)提供的一組條目。它最多支持五個鍵/值對:
ImmutableMap<String, String> immutableMap
= ImmutableMap.of("USA", "North America", "Costa Rica", "North America");
assertTrue(immutableMap.containsKey("USA"));
assertTrue(immutableMap.containsKey("Costa Rica"));
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
java數(shù)據(jù)類型轉(zhuǎn)換陷阱包括列表陷阱
這篇文章主要介紹了java數(shù)據(jù)類型轉(zhuǎn)換的一些陷阱,包括基本數(shù)據(jù)類型轉(zhuǎn)換列表陷阱,基本上這一篇就把常見的問題就給大家分享一下2020-10-10
Apache?Commons?BeanUtils:?JavaBean操作方法
這篇文章主要介紹了Apache?Commons?BeanUtils:?JavaBean操作的藝術(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
使用spring通過aop獲取方法參數(shù)和參數(shù)值
這篇文章主要介紹了使用spring通過aop獲取方法參數(shù)和參數(shù)值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringCloud之熔斷器Hystrix的實現(xiàn)
這篇文章主要介紹了SpringCloud之熔斷器Hystrix的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Java調(diào)用Oss JDk實現(xiàn)刪除指定目錄下的所有文件
這篇文章主要為大家詳細(xì)介紹了Java如何調(diào)用Oss JDk實現(xiàn)刪除指定目錄下的所有文件功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2025-03-03

