Java中如何實(shí)現(xiàn)不可變Map詳解
前言
有時(shí)最好不允許修改 java.util.Map
, 例如跨線程共享只讀數(shù)據(jù)。為此,我們可以使用Unmodifiable Map或Immutable Map。
在這個(gè)快速教程中,我們將看到它們之間的區(qū)別。然后,我們將介紹可以創(chuàng)建不可變Map的各種方法。
下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
不可修改與不可變
Unmodifiable Map其實(shí)是一個(gè)可以修改的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ù),是不允許對(duì)其進(jìn)行修改。因此,一旦創(chuàng)建了不可變Map的實(shí)例,數(shù)據(jù)就不會(huì)以任何方式改變。
Guava不變Map
Guava提供了每個(gè)java.util的不可變版本。使用 ImmutableMap 映射 。每當(dāng)我們嘗試修改它時(shí),它都會(huì)拋出 UnsupportedOperationException。
由于它包含自己的私有數(shù)據(jù),因此在更改原始地圖時(shí),此數(shù)據(jù)不會(huì)更改。
我們現(xiàn)在將討論創(chuàng)建ImmutableMap實(shí)例的各種方法 。
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)建一個(gè)不可變的Map,其中包含動(dòng)態(tài)提供的一組條目。它最多支持五個(gè)鍵/值對(duì):
ImmutableMap<String, String> immutableMap = ImmutableMap.of("USA", "North America", "Costa Rica", "North America"); assertTrue(immutableMap.containsKey("USA")); assertTrue(immutableMap.containsKey("Costa Rica"));
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
java后臺(tái)如何利用Pattern提取所需字符詳解
這篇文章主要給大家介紹了關(guān)于java后臺(tái)如何利用Pattern提取所需字符的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01java算法Leecode刷題統(tǒng)計(jì)有序矩陣中的負(fù)數(shù)
這篇文章主要為大家介紹了java算法Leecode刷題統(tǒng)計(jì)有序矩陣中的負(fù)數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10舉例說(shuō)明JAVA調(diào)用第三方接口的GET/POST/PUT請(qǐng)求方式
在日常工作和學(xué)習(xí)中,有很多地方都需要發(fā)送請(qǐng)求,這篇文章主要給大家介紹了關(guān)于JAVA調(diào)用第三方接口的GET/POST/PUT請(qǐng)求方式的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01java實(shí)現(xiàn)簡(jiǎn)單的拼圖游戲
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的拼圖游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07maven打包zip包含bin下啟動(dòng)腳本的完整代碼
這篇文章主要介紹了maven打包zip包含bin下啟動(dòng)腳本,本文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10Java基礎(chǔ)知識(shí)之StringReader流的使用
這篇文章主要介紹了Java基礎(chǔ)知識(shí)之StringReader流的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12