java禁止修改map_Java中实现不可变Map
有時最好不允許修改??java.util.Map,?例如跨線程共享只讀數據。為此,我們可以使用Unmodifiable Map或Immutable Map。
在這個快速教程中,我們將看到它們之間的區別。然后,我們將介紹可以創建不可變Map的各種方法。
不可修改與不可變
Unmodifiable Map其實是一個可以修改的map的包裝器,不允許直接修改它。
Map mutableMap = new HashMap<>();
mutableMap.put("USA", "North America");
Map 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包含其自己的私有數據,是不允許對其進行修改。因此,一旦創建了不可變Map的實例,數據就不會以任何方式改變。
Guava
不變Map
Guava
提供了每個java.util的不可變版本。使用??ImmutableMap?映射?。每當我們嘗試修改它時,它都會拋出??UnsupportedOperationException。
由于它包含自己的私有數據,因此在更改原始地圖時,此數據不會更改。
我們現在將討論創建ImmutableMap實例的各種方法??。
1. 使用copyOf()方法:
首先,讓我們使用ImmutableMap.copyOf()??方法,該方法返回原始Map中所有條目的副本:
ImmutableMap immutableMap = ImmutableMap.copyOf(mutableMap);
assertTrue(immutableMap.containsKey("USA"));
它不能直接修改,但是可以改變其內部可變的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()??方法創建原始Map中所有條目的副本。
此外,我們可以使用此方法添加原始Map中不存在的其他條目:
ImmutableMap immutableMap = ImmutableMap.builder()
.putAll(mutableMap)
.put("Costa Rica", "North America")
.build();
assertTrue(immutableMap.containsKey("USA"));
assertTrue(immutableMap.containsKey("Costa Rica"));
3.?使用of()
最后,我們可以使用ImmutableMap.of()??方法創建一個不可變的Map,其中包含動態提供的一組條目。它最多支持五個鍵/值對:
ImmutableMap immutableMap
= ImmutableMap.of("USA", "North America", "Costa Rica", "North America");
assertTrue(immutableMap.containsKey("USA"));
assertTrue(immutableMap.containsKey("Costa Rica"));
總結
以上是生活随笔為你收集整理的java禁止修改map_Java中实现不可变Map的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 模糊查询用法_mysql进阶
- 下一篇: 数据传址赋值问题