你好朋友,

在本教程中,我们将看到如何用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相关推荐

  1. 如何用Java创建ZIP文档?

    今天来给大家讲解一下ZIP压缩文件,以及如何使用API将数据压缩到可共享的加密或不加密ZIP存档中.喜欢的小伙伴记得点赞关注哟~ 现在每个人的日常工作中,ZIP文件已经无处不在,可以说是对于处理大量数 ...

  2. 如何用java创建超链接_Java如何在PPT中的幻灯片上创建超链接?

    在Java编程中,如何在PPT中的幻灯片上创建超链接? 注意:需要访问网址:http://poi.apache.org/download.html , 下载一个Apache POI软件包.这里下载最新 ...

  3. java 如何创建一个数组_如何用Java创建一个数组?

    在Java中,可以使用new关键字像对象一样创建数组.使用new关键字在Java中创建数组的语法-type[] reference = new type[10]; 哪里,type是数组元素的数据类型. ...

  4. 如何用java创建一个文件

    public void createFile(){                  String path= "G:\\yuchao\\测试"; //所创建文件的路径       ...

  5. java创建一个不可变对象_如何在Java中创建不可变类?

    java创建一个不可变对象 Today we will learn about the immutable class in Java. What are immutable classes? The ...

  6. Java创建简单订房管理程序(附详细代码)

    如何用java创建一个简单的订房管理程序呢 首先,我们需要明确功能,该订房管理程序有4个基本功能: 1. 订房 2. 退房 3. 查询 4. 退出 我们假设某酒店有3层客房,一层为单人间,二层为标准间 ...

  7. java 8 不可变map_Java中如何实现不可变Map详解

    前言 有时最好不允许修改  java.util.map, 例如跨线程共享只读数据.为此,我们可以使用unmodifiable map或immutable map. 在这个快速教程中,我们将看到它们之间 ...

  8. java创建一个不可变对象_使用不可变对象创建值对象

    java创建一个不可变对象 在回答我最近的文章中AutoValue:生成的不可变的值类 , 布兰登认为,这可能是有趣的,看看如何AutoValue比较项目Lombok和Immutables和凯文借调这 ...

  9. setyear java_如何在Java中创建不可变类

    如果对象在构造后无法更改,则该对象是不可变的.不可变对象不会以任何方式暴露其他对象来修改其状态; 对象的字段仅在构造函数内初始化一次,并且永远不会再次更改. 在本文中,我们将定义在Java中创建不可变 ...

最新文章

  1. SpringBoot直接访问图片资源
  2. python3中tkinter button属性_Python3 tkinter基础 Button bg 按钮的背景颜色
  3. [C# 基础知识梳理系列]专题二:委托的本质论
  4. Android7.0 PowerManagerService(1) 启动过程
  5. 将用户添加到sudoers_在CentOS系统中将用户添加到Sudoers文件的方法
  6. 2018.10.29-2018.11.4
  7. Java学习之路之Hello World小程序
  8. wamp配置中的大小写
  9. 按条件分类_史上最全物流仓储分类方式
  10. k8s之PodIP、ClusterIP和ExternalIP
  11. BT5R3安装及汉化
  12. 如何更好地吸收维生素矿物质?
  13. 【电脑系统】c盘误操作删除EFI引导分区后,开机一直checking media
  14. 《程序员的自我修养》学习笔记之温故而知新
  15. 微软lync 持续服务器,Lync Server 2013 持久聊天服务器通道关闭
  16. Scrapy框架: 异常错误处理
  17. Win10无法调节亮度解决方法
  18. 5-46 新浪微博热门话题 (30分)
  19. 用JS实现猜数字游戏
  20. VMware中ubuntu设置成中文

热门文章

  1. nssl1305-最大值【dp,数学】
  2. jzoj4235-序列【斐波那契数列】
  3. Codeforces Round #666 (Div. 2)
  4. 【归并排序】奶牛的图片(jzoj 1812)
  5. 【并查集】【图论】旅行(ssl 1312)
  6. 数学题 贪心+二分答案
  7. 12、数据库的设计范式
  8. 42、Java服务内存OOM原因分析
  9. 分布式作业 Elastic Job 如何动态调整
  10. mybatis环境搭建步骤(含配置文件代码)