溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中如何實(shí)現(xiàn)不可變Map詳解

發(fā)布時(shí)間:2020-09-29 10:29:00 來源:腳本之家 閱讀:222 作者:banq 欄目:編程語言

前言

有時(shí)最好不允許修改  java.util.Map, 例如跨線程共享只讀數(shù)據(jù)。為此,我們可以使用Unmodifiable Map或Immutable Map。

在這個(gè)快速教程中,我們將看到它們之間的區(qū)別。然后,我們將介紹可以創(chuàng)建不可變Map的各種方法。

下面話不多說了,來一起看看詳細(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ù),是不允許對其進(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è)鍵/值對:

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í)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI