如何用Java创建不可变的Map

你好朋友,

在本教程中,我们将看到如何用Java创建不可变的Map。

–不可变的类或对象是什么意思?

–什么是不可变地图?

–如何在Java中创建不可变的Map?

不变的类或对象是什么意思?

不可变的类或对象是创建后状态不会改变的类或对象。例如Java中的String类是不可变的,因此,如果我们尝试对String对象进行更改,它将创建一个新的String对象,但是当前对象的状态不会改变。因此,如果实例化一个不可变的类,则一旦创建该实例,便无法更改其状态。

什么是不可变地图?

因此,考虑到以上对不可变的定义,不可变地图是一种我们一旦创建就无法插入,更新或删除元素的地图,通常要求此类地图具有不希望更改的内容,例如国家/地区这是货币。

如何在Java中创建不可变的Map?

我们可以通过多种方式创建不可变地图。

–使用Collections.unmodifiableMap()

–使用Map.of()

–使用Map.ofEntries()

–使用Map.copyOf()

使用Collections.unmodifiableMap()

当我们使用Collections.unmodifiableMap(originalMap)时,它会在原始地图上创建一个视图,这样我们就不能在该视图上添加,删除或更新,如果尝试尝试,则会出现UnSupportedOperation异常,但我们只能查看在原始地图中。

我们仍然可以更新原始地图,并且当我们更改原始地图时,更改也会反映在视图中。 因此这并不是真正意义上的创建不可变地图。但是,我们仍然可以使用Collections.unmodifiableMap()创建不可变地图。 对于第二个例子。

Map<String, Integer> originalMap1 = new HashMap<String, Integer>(); originalMap1.put("a", 1); originalMap1.put("b", 2);originalMap1.put("c", 3);Map<String, Integer> unmodifiableMap1 = Collections.unmodifiableMap(originalMap1);//unmodifiableMap1.put("d", 4);System.out.println("Size of originalMap1 before adding new data:"+originalMap1.size());System.out.println("Size of unmodifiableMap1 before adding new data:"+ unmodifiableMap1.size());originalMap1.put("e", 5);System.out.println("Size of originalMap1 after adding new data:"+originalMap1.size());System.out.println("Size of unmodifiableMap1 after adding new data:"+unmodifiableMap1.size());

例子2

Map<String, Integer> originalMap2 = new HashMap<String, Integer>(); originalMap2.put("a", 1); originalMap2.put("b", 2);originalMap2.put("c", 3);Map<String, Integer> unmodifiableMap2 = Collections.unmodifiableMap(new HashMap<String, Integer>(originalMap2));//unmodifiableMap2.put("d", 4);System.out.println("Size of originalMap2 before adding new data:"+originalMap2.size());System.out.println("Size of unmodifiableMap2 before adding new data:"+ unmodifiableMap2.size());originalMap2.put("e", 5);System.out.println("Size of originalMap2 after adding new data:"+originalMap2.size());System.out.println("Size of unmodifiableMap2 after adding new data:"+unmodifiableMap2.size());

在这里,我们没有传递对原始地图的引用,而是创建了一个HashMap的新实例,将其传递给原始的hashMap,然后将该HashMap的这个新实例传递给Collecitons.unmodifiableMap()方法。我们在此处获得的“ unmodifiableMap2”是不可变的,因此即使您在原始哈希图中进行了更改,它也不会反映在unmodifiableMap2实例中。

使用Map.of()

Map.of()是Java 9中引入的。以下示例是不言自明的。如果我们有少于等于10个键值对,则应使用此方法,因为如果看到Of()方法的重载,则最多有10个Of()方法的重载中允许的键值对。

static <K, V> Map<K, V> of() 
static <K, V> Map<K, V> of(K k1, V v1) 
static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2)
.
.
.
static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10)

Map<String, Integer> immutableMap1 = Map.of("a", 1, "b",2, "c",3);//immutableMap1.put("d", 4);     //Will throw UnsupportedOperaironExceptionSystem.out.println("Size of immutableMap1:"+ immutableMap1.size());

使用Map.ofEntries()

Java 9中也引入了Map.ofEntries(),当我们拥有超过10个键值对时,可以使用这种创建不可变映射的方法。

该方法的签名如下:

static <K, V> Map<K, V> ofEntries(Entry<? extends K, ? extends V>... entries)

Map<String, Integer> immutableMap2 = Map.ofEntries(entry("a",1),entry("b",2),entry("c",3));//immutableMap2.put("d", 4);System.out.println("Size of immutableMap2 :"+immutableMap2.size());

使用Map.copyOf()

Java.10中引入了Map.copyOf()。

该方法的签名如下:

static <K, V> Map<K, V> copyOf(Map<? extends K, ? extends V> map)

Map<String, Integer> originalMap5 = new HashMap<String, Integer>(); originalMap5.put("a", 1); originalMap5.put("b", 2);originalMap5.put("c", 3);Map<String, Integer> immutableMap3 = Map.copyOf(originalMap5);//immutableMap3.put("d", 4);System.out.println("Size of originalMap5 before adding new data:"+originalMap5.size());originalMap5.put("e", 5);System.out.println("Size of originalMap5 after adding new data:"+originalMap5.size());System.out.println("Size of immutableMap3 after adding new data:"+immutableMap3.size());

package com.blogspot.javasolutionsguide.immutable_map_java_example;import static java.util.Map.entry;import java.util.Collections;
import java.util.HashMap;
import java.util.Map;/*** ImmutableMapTest.**/
public class ImmutableMapTest 
{public static void main( String[] args ) {//Unmodifiable Map<String, Integer> originalMap1 = new HashMap<String, Integer>(); originalMap1.put("a", 1); originalMap1.put("b", 2);originalMap1.put("c", 3);Map<String, Integer> unmodifiableMap1 = Collections.unmodifiableMap(originalMap1);//unmodifiableMap1.put("d", 4);System.out.println("Size of originalMap1 before adding new data:"+originalMap1.size());originalMap1.put("e", 5);System.out.println("Size of originalMap1 after adding new data:"+originalMap1.size());System.out.println("Size of unmodifiableMap1 after adding new data:"+unmodifiableMap1.size());//Example 2Map<String, Integer> originalMap2 = new HashMap<String, Integer>(); originalMap2.put("a", 1); originalMap2.put("b", 2);originalMap2.put("c", 3);Map<String, Integer> unmodifiableMap2 = Collections.unmodifiableMap(new HashMap<String, Integer>(originalMap2));//unmodifiableMap2.put("d", 4);System.out.println("Size of originalMap2 before adding new data:"+originalMap2.size());originalMap2.put("e", 5);System.out.println("Size of originalMap2 after adding new data:"+originalMap2.size());System.out.println("Size of unmodifiableMap2 after adding new data:"+unmodifiableMap2.size());//Example 3Map<String, Integer> immutableMap1 = Map.of("a", 1, "b",2, "c",3);//immutableMap1.put("d", 4);     //Will throw UnsupportedOperaironExceptionSystem.out.println("Size of immutableMap1:"+ immutableMap1.size());//Example 4Map<String, Integer> immutableMap2 = Map.ofEntries(entry("a",1),entry("b",2),entry("c",3));//immutableMap2.put("d", 4);System.out.println("Size of immutableMap2 :"+immutableMap2.size());//Example 5Map<String, Integer> originalMap5 = new HashMap<String, Integer>(); originalMap5.put("a", 1); originalMap5.put("b", 2);originalMap5.put("c", 3);Map<String, Integer> immutableMap3 = Map.copyOf(originalMap5);//immutableMap3.put("d", 4);System.out.println("Size of originalMap5 before adding new data:"+originalMap5.size());originalMap5.put("e", 5);System.out.println("Size of originalMap5 after adding new data:"+originalMap5.size());System.out.println("Size of immutableMap3 after adding new data:"+immutableMap3.size());}
}

总结:

因此,在本教程中,我们了解了如何在Java中创建不可变映射。当我们知道将来映射的内容不会改变时,这非常有用。我们了解了JDK如何使用各种方法来创建不可变映射。

谢谢阅读。 订阅我们的博客以获取更多此类有趣的帖子。

翻译自: https://www.javacodegeeks.com/2020/03/how-to-create-immutabe-map-in-java.html

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

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

相关文章

quartz java 线程 不释放_java Quartz 内存泄漏

我用定时器启动应用的时候发现内存泄漏&#xff0c;具体报错如下&#xff1a;十月 30, 2015 2:30:12 下午 org.apache.catalina.startup.HostConfig undeploy信息: Undeploying context [/ChinaMoney Maven Webapp]十月 30, 2015 2:30:15 下午 org.apache.catalina.loader.Weba…

在ultraedit查找每行第二个单词_新手收藏!亚马逊关键字查找

亚马逊销售中最重要的是“排名”。而“关键字”对提高排名很重要。搜索结果对亚马逊的销售产生重大影响。要想让你的产品被显示在搜索结果的顶部&#xff0c;那你必须选择有效的关键字。搜索关键词排名一直上不去&#xff0c;你可能会这么想&#xff1a;“关键字不好吧......。…

java opencv磨皮算法_使用OPENCV简单实现具有肤质保留功能的磨皮增白算法

在一个美颜高手那里发现一个美颜算法&#xff0c;他写出了数学表达式&#xff0c;没有给出代码&#xff0c;正好在研究OPENCV&#xff0c;顺手实现之。具体过程就是一系列矩阵运算&#xff0c;据说是从一个PS高手那里研究 出来的&#xff0c;一并表示感谢。这是数学表达式&…

junit单元测试断言_简而言之,JUnit:单元测试断言

junit单元测试断言简而言之&#xff0c;本章涵盖了各种单元测试声明技术。 它详细说明了内置机制&#xff0c; Hamcrest匹配器和AssertJ断言的优缺点 。 正在进行的示例扩大了主题&#xff0c;并说明了如何创建和使用自定义匹配器/断言。 单元测试断言 信任但要验证 罗纳德里…

keyshot环境素材文件_KeyShot渲染,打光这么打,效果倍儿棒

有过渲染经验的小伙伴们应该知道&#xff0c;除了需要对渲染软件的操作熟悉外&#xff0c;最重要的莫过于“材质”和“灯光”。而这里&#xff0c;就不得不提到KeyShot&#xff0c;作为工业设计行业必须要掌握的技能之一&#xff0c;它在行业当中的地位可谓独树一帜。除了其操作…

redis种类型对应java类型_Redis的五种基本数据类型介绍

Redis作为缓存具有极其丰富的功能&#xff0c;比如计数器、好友关系以及排行榜等等。而Redis之所能够实现如此强大的功能&#xff0c;完全是依赖着它的基本数据结构。今天我们来看看Redis的五种基本的数据结构&#xff0c;分别是字符串(strings)&#xff0c; 散列(hashes)&…

REST /使用提要发布事件

处理事件 当使用多个解耦的服务时&#xff08;例如&#xff0c;在微服务体系结构中 &#xff09;&#xff0c;很有可能需要一种将某种域事件从一个服务发布到一个或多个其他服务的方法。 许多广泛采用的解决方案依赖于单独的基础结构来解决此问题&#xff08;例如事件总线或消…

hibernate自动配置_Hibernate自动冲洗的黑暗面

hibernate自动配置介绍 既然我已经描述了JPA和Hibernate刷新策略的基础知识 &#xff0c;我就可以继续阐明Hibernate的AUTO刷新模式的令人惊讶的行为。 并非所有查询都会触发会话刷新 许多人会认为Hibernate 总是在执行任何查询之前先刷新Session。 虽然这可能是一种更直观的方…

slf4j注解log报错_SpringBoot自定义日志注解,用于数据库记录操作日志,你用过吗?...

大家好&#xff0c;我是程序员7歌&#xff01;今天我将为大家讲解如何通过自定义注解记录接口访问日志。一般的开发中&#xff0c;有两种方式可以记录日志信息&#xff0c;第一种&#xff1a;把接口日志信息保存到日志文件中&#xff0c;第二种&#xff1a;把接口操作日志保存到…

java applet audion_java applet audion

①希罗尤尔和他的飞翼敢达也有着不少拥趸&#xff0c;让我们期待这位美少年在《敢达决战》中的表现吧。②颜值时代&#xff0c;浏览器皮肤也不能输360浏览器耳目一新的设计&#xff0c;高清精美的壁纸&#xff0c;让你上网时更添一份好心情。软件使用1、支持游戏小号2、优化小程…

markdown 流程图_Markdown 进阶技能:用代码画流程图(编程零基础也适用)

这篇文章主要介绍流程图基础以写代码的方式画流程图相比于使用画图工具拖拽画图&#xff0c;用代码画图有什么好处&#xff1f;首先&#xff0c;这种方式非常轻便&#xff0c;无需安装复杂的画图应用。Typora 等多种 Markdown 编辑器自带有画图扩展&#xff08;这也是 Markdown…

java jtree_Java JTree

Java JTree1 Java JTree的介绍JTree类用于显示树结构数据或层次结构数据。JTree是一个复杂的组件。它的最顶部有一个“根节点”&#xff0c;它是树中所有节点的父节点。它继承了JComponent类。2 Java JTree的声明我们来看一下javax.swing.JTree类的声明。public class JTree ex…

akka和rabbitmq_Akka Notes –演员记录和测试

akka和rabbitmq在前两部分&#xff08; 一 &#xff0c; 二 &#xff09;中&#xff0c;我们简要讨论了Actor以及消息传递的工作方式。 在这一部分中&#xff0c;让我们看一下如何修复并记录我们的TeacherActor 。 回顾 这就是我们上一部分中的Actor的样子&#xff1a; class…

完数c++语言程序_C语言经典100题(19)

1上期答案揭晓首先给大家看看上一篇文章C语言经典100题(18)中第三部分编程题的答案&#xff1a;#includeint main(){ int s0,a,n,t; printf("请输入 a 和 n&#xff1a;\n"); scanf("%d%d",&a,&n); ta; while(n>0) { …

古巴:为生产做准备

“它可以在我的本地机器上运行&#xff01;” 如今&#xff0c;这听起来像模因&#xff0c;但仍然存在“开发环境与生产环境”的问题。 作为开发人员&#xff0c;您应始终牢记&#xff0c;您的应用程序有一天将在生产环境中开始运行。 在本文中&#xff0c;我们将讨论一些特定于…

hibernate脏数据_Hibernate脏检查的剖析

hibernate脏数据介绍 持久性上下文使实体状态转换入队 &#xff0c;该实体状态转换在刷新后转换为数据库语句。 对于托管实体&#xff0c;Hibernate可以代表我们自动检测传入的更改并安排SQL UPDATE。 这种机制称为自动脏检查 。 默认的脏检查策略 默认情况下&#xff0c;Hibe…

php组成,php接口有几部分组成?

程序接口&#xff0c;由一套陈述、功能、选项、其它表达程序结构的形式、以及程序师使用的程序或者程序语言提供的数据组成PHP接口(interface)的特点1、接口的方法必须是公开的。2、接口的方法默认是抽象的&#xff0c;所以不在方法名前面加abstract。3、接口可以定义常量&…

java 解析日期格式_日期/时间格式/解析,Java 8样式

java 解析日期格式自Java 几乎 开始以来&#xff0c;Java开发人员就通过java.util.Date类&#xff08;自JDK 1.0起&#xff09;和java.util.Calendar类&#xff08;自JDK 1.1起 &#xff09;来处理日期和时间。 在这段时间内&#xff0c;成千上万&#xff08;甚至数百万&#x…

php第三方登录代码,thinkPHP5项目中实现QQ第三方登录功能

本文实例讲述了thinkPHP5项目中实现QQ第三方登录功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;最近用thinkPHP 5框架做了一个婚纱店的项目&#xff0c;在开发过程中需要用到第三方登录&#xff0c;腾讯官方给的案例是几个文件相互包含实现的&#xff0c;放到tp5…

mac 显示隐藏文件_如何在Mac上显示隐藏文件?苹果mac显示隐藏文件夹方法

与任何操作系统一样&#xff0c;macOS会将重要文件隐藏起来&#xff0c;以防止意外删除它们并因此而损坏系统。但是&#xff0c;在某些情况下&#xff0c;您可能需要在Mac上显示隐藏文件&#xff0c;例如&#xff0c;浏览“ 库”文件夹并清除旧日志&#xff0c;缓存或其他垃圾文…