java禁止修改map_Java中实现不可变Map

有时最好不允许修改  java.util.Map, 例如跨线程共享只读数据。为此,我们可以使用Unmodifiable Map或Immutable Map。

在这个快速教程中,我们将看到它们之间的区别。然后,我们将介绍可以创建不可变Map的各种方法。

不可修改与不可变

Unmodifiable Map其实是一个可以修改的map的包装器,不允许直接修改它。

Map mutableMap = new HashMap<>();

mutableMap.put("USA", "North America");

Map 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 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 immutableMap = ImmutableMap.builder()

.putAll(mutableMap)

.put("Costa Rica", "North America")

.build();

assertTrue(immutableMap.containsKey("USA"));

assertTrue(immutableMap.containsKey("Costa Rica"));

3. 使用of()

最后,我们可以使用ImmutableMap.of()  方法创建一个不可变的Map,其中包含动态提供的一组条目。它最多支持五个键/值对:

ImmutableMap immutableMap

= ImmutableMap.of("USA", "North America", "Costa Rica", "North America");

assertTrue(immutableMap.containsKey("USA"));

assertTrue(immutableMap.containsKey("Costa Rica"));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昨夜,5G R16标准正式冻结!5G物联网扬帆起航

作者&#xff1a;赵小飞物联网智库 整理发布转载请注明来源和出处导 读昨天夜里&#xff0c;负责5G标准的国际组织3GPP TSG&#xff03;88全体会议宣布5G R16标准冻结。在新冠疫情全球肆虐的背景下&#xff0c;标准化推进工作遇到非常大的挑战&#xff0c;而3GPP的专家们依然能…

Linux下grub.cnf详解

grub.conf跟系统启动项有关&#xff0c;对于重置密码。来说小case。。。 1、介绍 在Red Hat Linux7.2之后&#xff0c;默认的引导加载程序从LTLO变为GRUB.这个引导加载程序使用户能够选择何时以及如何引导安装在计算机硬盘上的可引导的操作系统。 2、说明 变量 说…

(二)用户相关操作

一、导入jar包 见 http://pan.baidu.com/s/1dE9kMJZ 二、导入c3p0并修改值 c3p0.driverClasscom.mysql.jdbc.Driver c3p0.jdbcUrljdbc:mysql://localhost:3306/store c3p0.userroot c3p0.password123456 三、导入工具类 见 http://pan.baidu.com/s/1miutJXe 有关这些工具类的分…

java配合ajax加快发展_配合JAVA的AJAX使用

概要Ajax是“Asynchronous JavaScript and XML”的简称&#xff0c;即异步的JavaScript和XML。readyState属性用来返回当前的请求状态&#xff0c;有五个可选值。分别是0到4&#xff0c;每个值的含义如下描述。 0&#xff1a;“未初始化”状态&#xff0c; 表示已经创建一个XML…

你以为美国商业航天那么牛只是因为马斯克?更多原因在这里!

来源&#xff1a;银河航天漫游指南2020年5月31日&#xff0c;SpaceX的载人龙飞船成功将两位宇航员成功送往国际空间站&#xff0c;成为有史以来第一家将人类送入太空轨道的私营企业。美国商业航天领域的进展有目共睹。载人龙飞船起飞瞬间这次成功发射打破了传统航天领域以国家力…

APP开发流程

https://wenku.baidu.com/view/04a51445c77da26924c5b058.html?fromsearch转载于:https://www.cnblogs.com/ada-openmind/p/7634453.html

java游戏应龙女魃转世_应龙和女魃的凄美爱情,究竟是爱情,还是阴谋?

人世间最痛苦的事情是什么&#xff1f;有人说是生老病死&#xff0c;也有人说是爱憎别离。对于她来说&#xff0c;或许最痛苦的是他的欺骗与背叛……女魃一、初见北荒往东二百里&#xff0c;有一座山&#xff0c;名唤玲珑山。山中住着一名神女&#xff0c;名为女魃。相传&#…

热点|因为AI不是人,美国专利局拒绝认定TA的所有发明权

来源&#xff1a;量子位「你不是人&#xff01;」——美国专利局&#xff08;USPTO&#xff09;。这句话是美国专利局&#xff0c;对所有人工智能说的。4月27日&#xff0c;美国专利局出台一项规定&#xff1a;对于任何由人工智能独立设计发明的产品&#xff0c;因为AI不是自然…

登陆界面代码

1、设计思想 添加窗口界面&#xff0c;想i面添加一系列组件。 输入账号密码和验证码后&#xff0c;如果验证码正确&#xff0c;进行注册&#xff0c;否则注册失败。注册成功后&#xff0c;验证码自动刷新&#xff0c;并将注册的帐号和密码保存。注册失败后&#xff0c;验证码刷…

java中如何调出字体对话框_java 字体对话框

本人不才&#xff01;花了很长时间写了这个代码。不是很好&#xff0c;比起Windows自带的字体对话框差一点。不过已经够用了。等将来有时间了&#xff0c;在进行完善。如果有什么好的建议&#xff0c;可以提。本人再补。预览效果如下图&#xff1a;package styleDispose;import…

为何苹果为何苹果甘愿冒险自主研发芯片?

来源&#xff1a;内容来自「腾讯科技」7月4日&#xff0c;据外媒报道&#xff0c;苹果不久前宣布将把Mac上使用的处理器从英特尔芯片迁移到自己的Apple Silicon上&#xff0c;尽管这是意料之中的事&#xff0c;但苹果为何甘愿冒险甚至似乎相当渴望进行这种转型的&#xff0c;仍…

用MXNet实现mnist的生成对抗网络(GAN)

用MXNet实现mnist的生成对抗网络(GAN) 生成式对抗网络&#xff08;Generative Adversarial Network&#xff0c;简称GAN&#xff09;由一个生成网络与一个判别网络组成。生成网络从潜在空间&#xff08;latent space&#xff09;中随机采样作为输入&#xff0c;其输出结果需要尽…

java单元格合并多列_ElementUI表格列相同值自动合并单元格( 多列 )

上篇文章写了如何在处理单列相同数据时让相同的项进行自动合并, 如果有多列合并的需求我们也应该可以从容应对...(产品: 你们看我干嘛?)废话不多说 上代码HTMLJSvar Main {data() {return {tableData6: [{name: 部门1,type: 0,amount1: 跟单员1,amount2: 成衣工厂1,amount3: …

【MIT港科大】最新《贝叶斯深度学习》2020综述论文,35页pdf全面阐述最新进展...

来源&#xff1a;专知来自MIT和香港科技大学的学者最新《贝叶斯深度学习》综述论文&#xff0c;值得关注&#xff01;地址&#xff1a;https://www.zhuanzhi.ai/paper/9b781282204cb581a31aa0e8b570dd95摘要一个综合的人工智能系统不仅需要用不同的感官(如视觉和听觉)感知环境&…

VisualVM远程监控Java

1、服务器启动jstatd服务设置&#xff1a; jstatd将使用RMISecurityPolicy&#xff0c;并且需要指定安全策略文件. 安全策略文件必须符合安全策略语法&#xff0c;通过命令 jstatd -J-Djava.security.policyfile指定策略文件。以下的安全策略配制是可以访问所有代码库. grant c…

java枚举怎么编译不行的_java – 打开枚举时Maven编译失败

我是一个mavenifying(是一个单词&#xff1f;)一个项目,其构建过程到目前为止完全基于ant /shell脚本.请考虑以下枚举public enum ResourceType {A, B;}以下bean&#xff1a;public ResourceTypeOwner {//set get resourceType property}以下代码片段&#xff1a;void foo(Reso…

​ 长达35页!美国公布未来新兴科技趋势报告

本文来源&#xff1a;笔记侠未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;云脑技术和企业图…

Linux命令行之逗趣无极限

Reference: http://os.51cto.com/art/201304/390059.htm 【2013年4月18日 51CTO外电头条】你有没有在Linux命令行中见过一辆火车呢&#xff1f;"猫跟老鼠"呢&#xff1f;编辑Linux命令行其实并不总是件严肃古板的事情。你完全可以用它自娱自乐。下面我们就跟大家一起…

java web的友好页面_JavaWeb 之 由 Tomcat 展示友好的错误信息页面

在 JavaWeb 工程中&#xff0c;可能会遇到 404 或 500 的错误页面&#xff0c;也有可能是由于异常显示的空白页面&#xff0c;但是此时并不想把这些页面给用户呈现出来&#xff0c;这时就需要给用户提示一些友好的信息。在部署 JavaWeb 工程时&#xff0c;只需要在 web.xml 中指…

【计算机视觉】计算机视觉入门大全:基础概念、运行原理、应用案例详解

来源&#xff1a;图灵人工智能 「机器能够模拟人类视觉系统」的幻想已经过时了。自 1960 年代第一批学术论文出现以来&#xff0c;计算机视觉已经走了很远&#xff0c;现代系统已经出现&#xff0c;且它们可以集成到移动应用中。今天&#xff0c;由于其广泛应用和巨大潜力&…