首页 > 其他分享 >如何创建不可变的Map对象

如何创建不可变的Map对象

时间:2023-04-23 21:24:29浏览次数:38  
标签:Map Java 对象 创建 不可 键值

在Java编程中,创建不可变的Map对象是一项非常重要的任务,这不仅有助于保证程序的线程安全性和安全性,同时还能避免意外的状态变化。本篇博客将详细介绍如何在Java程序中创建不可变的Map对象,以及Java 8之前和之后的版本间的差异。

什么是不可变类或对象?

不可变的类或对象是指在创建后其状态无法改变的类或对象。这也就意味着,不可变的类或对象是线程安全的且任何时候都具有相同的状态。

在Java中,String类就是一个很好的例子。由于String实例的状态一旦创建就无法改变,因此它们是不可变的。这也就是为什么字符串可以在Java编程中被广泛应用的原因之一。

Java 8之前的版本如何创建不可变的Map对象?

在Java 8之前,创建不可变的Map对象需要使用Collections类的unmodifiableMap()方法进行封装。具体来说,我们可以使用以下代码创建一个包含两个键值对的不可变Map对象:

Map<String, String> map = Collections.unmodifiableMap(new HashMap<String, String>() {{
    put("key1", "value1");
    put("key2", "value2");
}});

在上述代码中,我们创建了一个新的HashMap对象,并向其中添加两个键值对。接着,我们调用了Collections的unmodifiableMap()方法,将这个HashMap对象封装为一个不可变的Map对象。由于返回的Map对象是不可变的,因此我们无法向其中添加或删除键值对,也无法修改已有的键值对。

Java 8如何创建不可变的Map对象?

在Java 8中,我们有了更加简单的方法来创建不可变的Map对象。Java 8引入了一个新的工厂方法——of(),用于创建少量元素的不可变Map对象。具体来说,我们可以使用以下代码创建一个包含两个键值对的不可变Map对象:

Map<String, String> map = Map.of("key1", "value1", "key2", "value2");

在上述代码中,我们调用了Map的of()方法,将两个键值对作为参数传入。该方法返回一个不可变的Map对象,其中包含这两个键值对。由于返回的Map对象是不可变的,因此我们无法向其中添加或删除键值对,也无法修改已有的键值对。

Java 8以后(Java 9)如何创建不可变的Map对象?

如果我们需要创建包含更多元素的不可变Map对象,则可以使用Map的ofEntries()方法。这个方法接受多个Map.Entry作为参数,每个Map.Entry表示一个键值对。具体来说,我们可以使用以下代码创建一个包含三个键值对的不可变Map对象:

Map<String, String> map = Map.ofEntries(
    Map.entry("key1", "value1"),
    Map.entry("key2", "value2"),
    Map.entry("key3", "value3"));

在上述代码中,我们调用了Map的ofEntries()方法,并将三个键值对表示为三个Map.Entry对象。这个方法返回一个不可变的Map对象,其中包含这三个键值对。同样地,由于返回的Map对象是不可变的,因此我们无法向其中添加或删除键值对,也无法修改已有的键值对。

总结

不可变的类或对象能够保证程序在运行时更加安全和可靠。在Java编程中,创建不可变的Map对象是一项非常重要的任务。

在Java 8之前,我们可以使用Collections类的unmodifiableMap()方法来创建不可变的Map对象。

而在Java 8中,我们可以使用Map的of()方法来分别创建少量元素的不可变Map对象。

在Java8之后,可以使用ofEntries()方法来创建多个元素的不可变Map对象。

标签:Map,Java,对象,创建,不可,键值
From: https://www.cnblogs.com/new-one/p/17347785.html

相关文章

  • Django4全栈进阶之路7 createsuperuser创建超级管理员账号
    在Django4中,可以使用createsuperuser命令来创建超级管理员账号。超级管理员拥有管理后台的所有权限,包括创建、编辑和删除用户、组、权限等操作。下面是创建超级管理员账号的步骤: 1、执行以下命令创建超级管理员账号: pythonmanage.pycreatesuperuser2、设置用户信......
  • Docker镜像的三种创建方法及dockerfile案例
    一、基于现有镜像创建1. 首先启动一个镜像,在容器里做修改(1)首先启动一个镜像,在容器里做修改dockerrun-itdcentos:7/bin/bash#创建并启动镜像dockerps#查看启动的镜像信息 2. 将修改后的容器提交为新的镜像,需要使用该容器的ID号创建新镜像(2)将修改后的容器提......
  • 如何遍历HashMap集合?
    在Java中,HashMap是一种常用的数据结构,它提供了快速的查找、插入和删除操作。当我们需要遍历HashMap中的所有元素时,可以利用三种不同的方法实现。方法一:使用键值对遍历HashMap中存储的是键值对的形式,因此最简单的方法就是直接遍历键值对。我们可以通过以下代码实现://创建一个Ha......
  • 【C++入门】类和对象(一) 详解(class、struct、类的定义、类的实例化、类的封装、对象
    1.面向过程和面向对象初步认识面向过程更加关注解决问题的过程和步骤。而面向对象关注的是对象,对一个事情拆分成不同的对象,靠对象之间的交互实现。例如:外卖系统面向过程:上架→点餐→派单→送餐注重过程步骤面向对象:(更加贴近现实之间的业务逻辑交互)骑手→商家←用户注重对象和对象......
  • 15面向对象特性
    面向对象特性封装在程序设计中,封装(Encapsulation)是对具体对象的一种抽象,即将某些部分隐藏起来,在程序外部看不到,其含义是其他程序无法调用。要了解封装,离不开“私有化”,就是将类或者是函数中的某些属性限制在某个区域之内,外部无法调用。封装的作用:1、保护隐私(把不想别人知道......
  • 纯c++删除自身目录,和该目录下的所有内容______以及创建文件夹
    头文件.h#ifndefAUTODELETEADDFOLDER_H#defineAUTODELETEADDFOLDER_H#include<unistd.h>#include<stdlib.h>#include<errno.h>#include<dirent.h>#include<string.h>#include<iostream>#include<sys/stat.h>#inclu......
  • 使用nmap扫描端口
    importnmapscanner=nmap.PortScanner()target='192.168.8.121'scanner.scan(target,arguments='-p-')forhostinscanner.all_hosts():print(host)ifscanner[host].state()=='up':print('Host:%s(......
  • 在Go中map[]bool与map[]struct{}性能对比
    在Go中,map[]struct{}在性能和内存消耗方面比map[]bool更好,时间上快了5%,内存消耗少了10%,尤其是在处理大型集合时。众所周知,Go语言没有内置Set,因此开发人员使用map来模仿Set的行为。使用map来实现Set意味着map的值不重要,我们只需要关注键的存在。大多数情况下,人们可能会选择bool,因为......
  • java程序new对象后加大括号{},匿名类,闭包,lamda表达式相关
     这种在源码中经常出现,所以我拿出来说一说步骤1 new一个匿名子类对象    我姑且叫这种情况为“匿名子类”吧,就是有这样的情况,你new一个类的时候直接加一对花括号,实际上已经创建了它的一个匿名子类。老实说,我第一次见到这种写法也是懵逼的。比如我有一个父类publicc......
  • 设计模式分类(创建型模式、结构型模式、行为模式) #2
    1.创建型模式创建型模式,就是创建对象的模式,抽象了实例化的过程。它帮助一个系统独立于如何创建、组合和表示它的那些对象。关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关系创建对象过程......