当前位置: 首页 > news >正文

java中创建不可变集合

一.应用场景

二.创建不可变集合的书写格式(List,Set,Map)

List集合 

package com.njau.d9_immutable;import java.util.Iterator;
import java.util.List;/*** 创建不可变集合:List.of()方法* "张三","李四","王五","赵六"* 创建不可变集合的书写形式*      在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合。*      方法名称*      static<E>   List<E>     of(E...elements)            创建一个具有指定元素的List集合对象*      static<E>   set<E>     of(E...elements)             创建一个具有指定元素的Set集合对象*      static<K,V>     Map<K,V>    of(E...elements)            创建一个具有指定元素的Map集合对象*      注意:这个集合不能添加,不能删除,不能修改*/
public class ImmutableDemo1 {public static void main(String[] args) {List<String> list = List.of("张三","李四","王五","赵六");System.out.println(list.get(0));System.out.println(list.get(1));System.out.println(list.get(2));System.out.println(list.get(3));System.out.println("-----------------------------------");for (String s : list) {System.out.println(s);}System.out.println("-----------------------------------");Iterator<String> it = list.iterator();while (it.hasNext()) {String next = it.next();System.out.println(next);}System.out.println("-----------------------------------");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}/*都会报错list.add("aaa");list.remove("张三");list.set(0,"洪七");*/}
}

Set集合

package com.njau.d9_immutable;import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class ImmutableDemo2 {public static void main(String[] args) {// 创建不可变的Set集合// 细节:当我们要获取一个不可变的set集合的时候,要满足set集合的要求,即集合中的元素不能重复// "张三","李四","王五","赵六"Set<String> set = Set.of("张三","李四","王五","赵六");for (String s : set) {System.out.println(s);}Iterator<String> it = set.iterator();while(it.hasNext()) {String next = it.next();System.out.println(next);}
/*set.add("萌二");set.remove("王五");*/}
}

Map集合 

package com.njau.d9_immutable;import java.util.HashSet;
import java.util.Map;
import java.util.Set;public class ImmutableDemo3 {public static void main(String[] args) {/**  创建不可变的Map集合*  细节1:Map集合中的元素是不可重复的*  细节2:Map里面的of方法,参数是有上限的,最多只能传递20个参数,10个键值对*  细节3:如果想要定义大于20个参数的不可变map对象,那么必须使用entries。即将key和value看作一个整体,再使用可变参数*/Map<String, String> map = Map.of("张三", "南京", "李四", "北京", "王五", "上海", "赵六","广州", "孙七", "深圳", "周八", "杭州", "武九", "宁波", "郑十", "苏州","刘一", "无锡", "陈二", "嘉兴");Set<String> set = map.keySet();for (String key : set) {String value = map.get(key);System.out.println(key + "=" + value);}System.out.println("------------------------------------------------");Set<Map.Entry<String, String>> entries = map.entrySet();    // 将map对象转变为entry对象for (Map.Entry<String, String> entry : entries) {System.out.println(entry.getKey() + "=" + entry.getValue());}}// 可变参数只能有一个,且放在参数的最后,因此无法设计/*public static<K,V> void of(K...keys,V...values) {}*/
}

 当使用Map集合时,其中的<K,V>参数最多只能有10对。参见下面的Map.of源码:

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) {return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,k6, v6, k7, v7, k8, v8, k9, v9, k10, v10);}

那么,当我们想要使用不可变的Map集合存储超过10个键值对元素的时候,该怎么办呢?请看三。

三.任意容量大小的不可变Map集合的建立

方法一:将<K,V>看作一个整体使用entrySet方法,将其作为一个整体存储在Set集合中,然后再使用toArray(T[])方法将Set集合转换为一个Map.Entry类型的数组(因为可变参数的本质是一个数组,而想要传递无限量的参数就必须使用可变参数,因此要将其转为数组)。而ofEntries(Entry<? extends K, ? extends V>... entries)方法就是用来接受一个可变参数(数组),存储在不可变的Map集合中。

package com.njau.d9_immutable;import java.util.HashMap;
import java.util.Map;
import java.util.Set;/*** 使用entry类型实现不可变的map集合构建*/
public class ImmutableDemo4 {public static void main(String[] args) {Map<String,String> hm = new HashMap<>();hm.put("张三", "南京");hm.put("李四", "北京");hm.put("王五", "上海");hm.put("赵六", "广州");hm.put("孙七", "深圳");hm.put("周八", "杭州");hm.put("武九", "宁波");hm.put("郑十", "苏州");hm.put("刘一", "无锡");hm.put("陈二", "嘉兴");hm.put("aaa","aaa");Set<Map.Entry<String, String>> entries = hm.entrySet();// 该数组大小没关系,因为大了会将多余空间置为null,小了会进行自动扩容Map.Entry[] arr2 = new Map.Entry[0];// 调用toArray(数组参数类型)方法将entries对象转换为Entries数组(可变参数)Map.Entry[] arr1 = entries.toArray(arr2);// 将Entries数组传入Map.ofEntries方法,生成一个不可变的Map集合Map map = Map.ofEntries(arr1);map.put("bbb","222");}
}
package com.njau.d9_immutable;import java.util.HashMap;
import java.util.Map;
import java.util.Set;/*** 使用entry类型实现不可变的map集合构建*/
public class ImmutableDemo4 {public static void main(String[] args) {Map<String,String> hm = new HashMap<>();hm.put("张三", "南京");hm.put("李四", "北京");hm.put("王五", "上海");hm.put("赵六", "广州");hm.put("孙七", "深圳");hm.put("周八", "杭州");hm.put("武九", "宁波");hm.put("郑十", "苏州");hm.put("刘一", "无锡");hm.put("陈二", "嘉兴");hm.put("aaa","aaa");// 链式编程Map<String, String> map = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));map.put("bbb","333");}
}

方法二:使用Map.copyOf直接生成一个不可变的Map集合(底层代码和上面原理一模一样)

package com.njau.d9_immutable;import java.util.HashMap;
import java.util.Map;
import java.util.Set;/*** 使用entry类型实现不可变的map集合构建*/
public class ImmutableDemo4 {public static void main(String[] args) {Map<String,String> hm = new HashMap<>();hm.put("张三", "南京");hm.put("李四", "北京");hm.put("王五", "上海");hm.put("赵六", "广州");hm.put("孙七", "深圳");hm.put("周八", "杭州");hm.put("武九", "宁波");hm.put("郑十", "苏州");hm.put("刘一", "无锡");hm.put("陈二", "嘉兴");hm.put("aaa","aaa");Map<String, String> map1 = Map.copyOf(hm);map1.put("ttt","777");}
}

相关文章:

java中创建不可变集合

一.应用场景 二.创建不可变集合的书写格式&#xff08;List&#xff0c;Set&#xff0c;Map) List集合 package com.njau.d9_immutable;import java.util.Iterator; import java.util.List;/*** 创建不可变集合:List.of()方法* "张三","李四","王五…...

D25【 python 接口自动化学习】- python 基础之判断与循环

day25 for 循环 学习日期&#xff1a;20241002 学习目标&#xff1a;判断与循环&#xfe63;-35 for 循环&#xff1a;如何遍历一个对象里的所有元素&#xff1f; 学习笔记&#xff1a; for 循环与while循环的区别 for循环的定义 使用for循环遍历序列 使用for循环遍历字典…...

HTTP1.0和HTTP1.1有什么区别

HTTP/1.0 和 HTTP/1.1 是两个不同版本的 HTTP 协议。虽然它们的核心功能都是提供网页数据传输&#xff0c;但 HTTP/1.1 对 HTTP/1.0 做了很多改进&#xff0c;提升了性能和灵活性。以下是它们的主要区别&#xff1a; 1. 持久连接&#xff08;Persistent Connection&#xff09…...

卡夫卡的理解

一、架构理解 在这个单聊新架构中&#xff0c;涉及多个服务器组件共同协作来实现单聊功能。 ChatAccessServer&#xff1a;可能负责处理单聊相关的访问请求&#xff0c;比如用户登录单聊以及发送单消息的请求接入。ChatHttpPushServer&#xff1a;推测其用于通过 HTTP 协议推…...

基础算法之滑动窗口--Java实现(上)--LeetCode题解:长度最小的子数组-无重复字符的子串-最大连续1的个数III-将x减到0的最小操作数

这里是Thembefue 今天讲解算法中较为经典的一个算法 > 滑动窗口 本讲解主要通过题目来讲解以理解算法 讲解分为三部分&#xff1a;题目解析 > 算法讲解 > 编写代码 滑动窗口 在正式进入题目的讲解之前&#xff0c;得先了解一下什么是滑动窗口&#xff0c;以及应该在什…...

Linux -- 文件系统(文件在磁盘中的存储)

目录 前言&#xff1a; 了解机械磁盘 初始盘片与磁头 盘片是怎么存数据的呢&#xff1f; 详解盘片 如何访问磁盘中的一个扇区呢&#xff1f; -- CHS 定位法 磁盘的逻辑存储 LBA&#xff08;Logical Block Addressing --- 逻辑块寻址&#xff09; 如何将 LBA 地址转换为…...

微服务(Microservices),服务网格(Service Mesh)以及无服务器运算Serverless简单介绍

文章目录 什么是微服务?一、定义与特点二、优势三、组件与架构四、应用场景五、挑战与解决方案什么是服务网格?一、定义与特点二、核心组件三、主要功能四、实现工具五、应用场景六、优势与挑战什么是Serverless?一、定义与特点二、主要领域三、优势四、应用场景五、挑战三者…...

【AIGC】AI时代的数据安全:使用ChatGPT时的自查要点

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;法律法规背景中华人民共和国保守秘密法中华人民共和国网络安全法中华人民共和国个人信息保护法遵守法律法规的重要性 &#x1f4af;ChatGPT的数据使用特点ChatGPT数据安全…...

什么是区块链桥?

什么是区块链桥&#xff1f; 区块链桥是一种实现资产从一个区块链转移至另一个区块链的工具&#xff0c;它解决了区块链技术中不同网络之间缺乏互操作性的问题。区块链桥通过创建代表另一区块链资产的合成衍生品&#xff0c;使得原本互不兼容的区块链资产能够相互连接和转移。…...

机器学习框架

机器学习框架 机器学习框架是用于开发和部署机器学习模型的软件工具。它们提供了一组API和工具&#xff0c;帮助开发人员在各种计算设备上构建、训练和部署机器学习模型。以下是几个常见的机器学习框架&#xff1a; 1.TensorFlow&#xff1a; TensorFlow是一个开源的人工智能…...

金三银四:20道前端手写面试题

文章目录 一、前言二、题目1. 防抖节流解读 2.一个正则题3. 不使用a标签&#xff0c;如何实现a标签的功能4. 不使用循环API 来删除数组中指定位置的元素&#xff08;如&#xff1a;删除第三位&#xff09; 写越多越好5. 深拷贝解读 6. 手写call bind applycall 解读apply 解读 …...

RAC被修改权限及相关问题

RDBMS &#xff1a; 19.19 修改RAC权限及相关问题 修改RAC权限&#xff0c;参考文档&#xff1a; How to check and fix file permissions on Grid Infrastructure environment (Doc ID 1931142.1) Script to capture and restore file permission in a directory (for eg. O…...

Golang | Leetcode Golang题解之第441题排列硬币

题目&#xff1a; 题解&#xff1a; func arrangeCoins(n int) int {return sort.Search(n, func(k int) bool { k; return k*(k1) > 2*n }) }...

数学建模--什么是数学建模?数学建模应该怎么准备?

前言 这是去年底学数学建模老哥的建模课程笔记&#xff1b;未来本人将陆陆续续的更新数学建模相关的一些基础算法&#xff0c;大家可以持续关注一下&#xff1b;提示&#xff1a;数学建模只有实战才能提升&#xff0c;光学算法没有啥意义&#xff0c;也很难学的很懂。 文章目录…...

Java项目实战II基于Java+Spring Boot+MySQL的智能物流管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 随着电商行业的蓬勃发展&#xff0c;物流行业迎来了前所未有的机遇与挑战。面对日益增长的订单量和复…...

【数据分享】2000—2023年我国省市县三级逐月植被覆盖度(FVC)数值(Shp/Excel格式)

之前我们分享过2000—2023年我国250米分辨率逐月植被覆盖度&#xff08;FVC&#xff09;栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff0c;该数据来源于高吉喜等学者在国家青藏高原科学数据中心平台上分享的数据&#xff0c;合成方式采用月最大值合成&…...

《Linux从小白到高手》理论篇(十一):Linux的系统环境管理

值此国庆佳节&#xff0c;深宅家中&#xff0c;闲来无事&#xff0c;就多写几篇博文。本篇详细深入介绍Linux的系统环境管理。 环境变量 linux系统下&#xff0c;如果你下载并安装了应用程序&#xff0c;很有可能在键入它的名称时出现“command not found”的提示内容。如果每…...

Qt/C++开源控件 自定义雷达控件

使用Qt框架创建一个简单的雷达图&#xff0c;包含动态扫描、目标点生成、刻度和方向标识。代码实现使用C编写&#xff0c;适合用作学习和扩展的基础。 1. 头文件与基本设置 #include "RadarWidget.h" #include <QPainter> #include <QPen> #include &…...

什么是IDE(集成开发环境)?

集成开发环境(IDE)详解 在软件开发的世界中,集成开发环境(IDE,Integrated Development Environment)扮演着至关重要的角色。它是一个综合性的软件应用程序,旨在为软件开发者提供一整套的、易于使用的工具集,以便他们能够更高效地编写、调试、测试和部署代码。简而言之…...

【Linux】用虚拟机配置Ubuntu 24.04.1 LTS环境

目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件&#xff0c;大家自己去下啊&#xff01; 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机&#xff0c;然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...