前言
有時最好不允許修改 java.util.map
, 例如跨線程共享只讀數據。為此,我們可以使用unmodifiable map或immutable map。
在這個快速教程中,我們將看到它們之間的區別。然后,我們將介紹可以創建不可變map的各種方法。
下面話不多說了,來一起看看詳細的介紹吧
不可修改與不可變
unmodifiable map其實是一個可以修改的map的包裝器,不允許直接修改它。
1
2
3
4
5
6
|
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中:
1
2
3
4
5
|
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中所有條目的副本:
1
2
|
immutablemap<string, string> immutablemap = immutablemap.copyof(mutablemap); asserttrue(immutablemap.containskey( "usa" )); |
它不能直接修改,但是可以改變其內部可變的map:
1
2
3
4
5
6
7
8
|
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中不存在的其他條目:
1
2
3
4
5
6
|
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()
方法創建一個不可變的map,其中包含動態提供的一組條目。它最多支持五個鍵/值對:
1
2
3
4
|
immutablemap<string, string> immutablemap = immutablemap.of( "usa" , "north america" , "costa rica" , "north america" ); asserttrue(immutablemap.containskey( "usa" )); asserttrue(immutablemap.containskey( "costa rica" )); |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://www.jdon.com/50941