时间:2021-05-20
前言
有时最好不允许修改 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"));总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java.util中的集合类包含Java中某些最常用的类。最常用的集合类是List和Map。List的具体实现包括ArrayList和Vector,它们是可变大
JavaString源码分析什么是不可变对象?众所周知,在Java中,String类是不可变的。那么到底什么是不可变的对象呢?可以这样认为:如果一个对象,在它创
java中Set与Map排序输出到Writer详解及实例一般来说java.util.Set,java.util.Map输出的内容的顺序并不是按key的顺序排列的
StringString:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。String类的包含如下定义:/**Theval
Java使用continue语句的实例详解在Java中,如何使用使用continue语句?下面示例中,演示如何使用continue语句跳过循环(实现统计指定字母