java 不可变map_如何用Java创建不可变的Map

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

java 不可变map

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

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

相关文章

ToolProvider.getSystemJavaCompiler() return null 的解决方法

【1】利用java 编译器API 编译 普通的java文件 1.1&#xff09;代码如下&#xff1a; package com.corejava.chapter10_2;import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStream;import javax.tools.JavaCompiler; import jav…

脚本错误和安全警报怎么解决_适用于应用程序错误的AWS警报

脚本错误和安全警报怎么解决监视对于任何实际应用都是关键的。 您必须知道正在发生的事情&#xff0c;并在发生问题时实时得到警报。 AWS为此提供了CloudWatch&#xff0c;并自动为您提供了许多指标。 但是&#xff0c;您必须定义一些自己的东西。 然后&#xff0c;您需要定义适…

java平台脚本+java编译器API

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2&#xff0c; 旨在学习 java平台脚本java编译器API 的 基础知识&#xff1b; ------------------------------------------------------------------------------ 【1】java平台的脚本 1&#xff09;脚本语…

Java 多线程总结

一、多线程实现方式 &#xff08;1&#xff09;继承Thread类&#xff0c;覆盖run方法 &#xff08;2&#xff09;实现Runnable接口&#xff0c;覆盖run方法&#xff0c;将对象传人Thread对象中实现Runnable接口比继承Thread类所具有的优势&#xff1a; 1&#xff09;适合多个相…

古巴比伦乘法_古巴:为生产做准备

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

java编译器API——使用编译工具

【0】README 0.1&#xff09;以下内容转自&#xff1a; http://suntips.iteye.com/blog/69002 0.2&#xff09;for basic java compiler API, please visit http://blog.csdn.net/pacosonswjtu/article/details/50718494 1&#xff09;当你需要更好的处理这些结果时,你可以使…

Java 线程同步总结

一、synchronized&#xff08;1&#xff09;synchronized方法 &#xff08;2&#xff09;synchronized块 二、Lock 注意&#xff1a;及时释放Lock锁&#xff0c;否则会出现死锁&#xff0c;通常在finally代码释放锁 &#xff08;1&#xff09;ReentrantLock 实现…

aws es方案_AWS Elasticsearch后模式

aws es方案碰巧我们在SaaS版本的LogSentinel上遇到了生产问题–我们的Elasticsearch停止了对新数据编制索引。 由于Elasticsearch只是辅助存储&#xff0c;因此没有数据丢失&#xff0c;但这给我们的客户带来了一些问题&#xff08;他们无法在其仪表板上看到实时数据&#xff0…

java注解总结

【0】README 0.1&#xff09;本文主要对 java 注解做总结&#xff1b; 【1】处理注解的级别 level1&#xff09; 在运行期级别处理注解&#xff1a; http://blog.csdn.net/pacosonswjtu/article/details/50719361level2&#xff09;在源码级别处理注解&#xff1a; http://b…

Java 类加载总结

一、类加载过程 装载链接验证准备解析初始化二、类初始化情况 1&#xff09;创建类的实例&#xff0c;也就是new一个对象 2&#xff09;访问某个类或接口的静态变量&#xff0c;或者对该静态变量赋值 3&#xff09;调用类的静态方法 4&#xff09;反射&#xff08;Class.…

maven依赖管理_依赖管理和Maven

maven依赖管理Maven伟大而成熟。 几乎所有事物都总有解决方案。 您可能在组织项目上遇到的主要情况是依赖管理。 而不是每个项目都具有自己的依赖关系&#xff0c;您需要一种集中的方式来继承那些依赖关系。 在这种情况下&#xff0c;您可以在父舞会上声明托管依赖项。 在我的…

JavaBean 持久化

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2&#xff0c;旨在学习 JavaBean 持久化 的基础知识&#xff1b; 0.2&#xff09;本文所有源代码荔枝均为原创&#xff1b; 0.3&#xff09; for complete souce code, please visit https://github.com/pa…

apache kafka_Apache Kafka消费者再平衡

apache kafka消费者重新平衡决定哪个消费者负责某个主题的所有可用分区的哪个子集。 例如&#xff0c;您可能有一个包含20个分区和10个使用者的主题。 在重新平衡结束时&#xff0c;您可能希望每个使用者都从2个分区中读取数据。 如果关闭了这些使用者中的10个&#xff0c;则可…

Java 注解总结

一、注解定义 注解早在J2SE1.5就被引入到Java中&#xff0c;主要提供一种机制&#xff0c;这种机制允许程序员在编写代码的同时可以直接编写元数据。 二、元注解 Target 说明了被修饰的注解的应用范围&#xff0c;也就是被修饰的注解可以用来注解哪些程序元…

编译原理三大经典书籍(龙书 虎书 鲸书)

以下内容转自&#xff1a; http://blog.csdn.net/skymingst/article/details/7436892 1、龙书&#xff08;Dragon book&#xff09; 英文名&#xff1a;Compilers: Principles,Techniques,and Tools 作者&#xff1a;Alfred V.Aho,Ravi Sethi,Jeffrey D.Ullman 中文名&…

两个时间之间是多少小时_那是两个小时我不会回来

两个时间之间是多少小时正如我之前关于linting主题所说的 &#xff0c;花时间修改代码的好处很有限&#xff0c;因为自动工具告诉您这样做。 更糟糕的是&#xff0c;这些工具并非万无一失。 例如&#xff0c;我们一直在针对完美无害的try-with-resources构造周围的SpotBugs警告…

java的类载入器

【0】README 0.1&#xff09;本文文字转自&#xff1a; 深入剖析tomcat&#xff0c; 旨在 理解 jvm 的类载入器&#xff1b; 【1】 jvm的类载入器相关 1&#xff09;jvm 使用了3种类载入器来载入所需要的类&#xff1a;分别是引导类载入器&#xff08;bootstrap class load…

Java 代理总结

一、代理 为其他对象提供一种代理以便控制对这个对象的访问。 &#xff08;1&#xff09;静态代理 &#xff08;2&#xff09;动态代理 1&#xff09;JDK自带的动态代理 2&#xff09;javaassist字节码操作库实现 3&#xff09;CGLIB 4&#xff09; ASM&#xff08;底层…

分解因数 递归_递归分解WAR文件

分解因数 递归抽象 是否曾经需要分解WAR文件以及分解WAR文件中的所有JAR文件&#xff1f; 是的&#xff0c;我也是&#xff01; 我写了ferris-war-exploder来爆炸&#xff1a; 一个JAR文件 一个WAR文件&#xff0c;它找到的每个JAR文件也会爆炸。 包含每个JAR文件&#xff…

jvm(2)-java内存区域

【0】README 0.1&#xff09;本文转自 深入理解jvm&#xff0c; 旨在学习 java内存区域 的基础知识&#xff1b; 【1】运行时数据区域 1&#xff09;jvm 所管理的内存将会包括以下几个运行时数据区域 1.1&#xff09;方法区&#xff1b;&#xff08;线程共享&#xff09; 1.2&…