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

所属分类: 软件编程 / java 阅读数: 39
收藏 0 赞 0 分享

前言

有时最好不允许修改  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"));

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

更多精彩内容其他人还在看

java实现背单词程序

这篇文章主要为大家详细介绍了java实现背单词程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java实现单词查询小程序

这篇文章主要为大家详细介绍了java实现单词查询小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java程序开发环境配置图文教程

这篇文章主要为大家详细介绍了Java程序开发环境配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解ssh框架原理及流程

在本文中小编给大家整理的是关于ssh框架原理及流程的相关知识点内容,有此需要的朋友们可以学习下。
收藏 0 赞 0 分享

Java实现弹窗效果的基本操作

这篇文章主要为大家详细介绍了Java实现弹窗效果的基本操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解springmvc常用5种注解

在本篇里我们给大家总结了关于springmvc常用5种注解相关知识点以及实例代码,需要的朋友们参考下。
收藏 0 赞 0 分享

Java实现弹窗效果的基本操作(2)

这篇文章主要为大家详细介绍了Java实现弹窗效果的基本操作第二篇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Spring Boot假死诊断实战记录

这篇文章主要给大家介绍了关于Spring Boot假死诊断的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享

Java计时新姿势StopWatch详解

这篇文章主要介绍了Java计时新姿势StopWatch,最近公司来了个大佬,从他那里学到不少东西,其中一个就是计时的新姿势「StopWatch」,需要的朋友可以参考下
收藏 0 赞 0 分享

java实现点击按钮弹出新窗体功能

这篇文章主要为大家详细介绍了java实现点击按钮弹出新窗体功能,旧窗体不进行操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多