评论

收藏

[Java] Java中如何实现不可变Map详解

编程语言 编程语言 发布于:2021-10-06 17:44 | 阅读数:179 | 评论:0

这篇文章主要给大家介绍了关于Java中如何实现不可变Map的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作工具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
前言
有时最好不允许修改  java.util.map, 例如跨线程共享只读数据。为此,我们可以使用unmodifiable map或immutable map。
在这个快速教程中,我们将看到它们之间的区别。然后,我们将介绍可以创建不可变map的各种方法。
下面话不多说了,来一起看看详细的介绍吧
不可修改与不可变
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包含其自己的私有数据,是不允许对其进行修改。因此,一旦创建了不可变map的实例,数据就不会以任何方式改变。
guava不变map
guava提供了每个java.util的不可变版本。使用  immutablemap 映射 。每当我们尝试修改它时,它都会抛出  unsupportedoperationexception。
由于它包含自己的私有数据,因此在更改原始地图时,此数据不会更改。
我们现在将讨论创建immutablemap实例的各种方法  。
1. 使用copyof()方法:
首先,让我们使用immutablemap.copyof()  方法,该方法返回原始map中所有条目的副本:
immutablemap<string, string> 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<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,其中包含动态提供的一组条目。它最多支持五个键/值对:
immutablemap<string, string> immutablemap
 = immutablemap.of("usa", "north america", "costa rica", "north america");
asserttrue(immutablemap.containskey("usa"));
asserttrue(immutablemap.containskey("costa rica"));
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对CodeAE代码之家的支持。
原文链接:https://www.jdon.com/50941

关注下面的标签,发现更多相似文章