Java中实现不可变Map

栏目: Java · 发布时间: 7年前

内容简介:有时最好不允许修改  java.util.Map, 例如跨线程共享只读数据。为此,我们可以使用Unmodifiable Map或Immutable Map。在这个快速教程中,我们将看到它们之间的区别。然后,我们将介绍可以创建不可变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"));

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Computer Age Statistical Inference

Computer Age Statistical Inference

Bradley Efron、Trevor Hastie / Cambridge University Press / 2016-7-21 / USD 74.99

The twenty-first century has seen a breathtaking expansion of statistical methodology, both in scope and in influence. 'Big data', 'data science', and 'machine learning' have become familiar terms in ......一起来看看 《Computer Age Statistical Inference》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

MD5 加密
MD5 加密

MD5 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具