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中创建不可变集合
一.应用场景 二.创建不可变集合的书写格式(List,Set,Map) List集合 package com.njau.d9_immutable;import java.util.Iterator; import java.util.List;/*** 创建不可变集合:List.of()方法* "张三","李四","王五…...
D25【 python 接口自动化学习】- python 基础之判断与循环
day25 for 循环 学习日期:20241002 学习目标:判断与循环﹣-35 for 循环:如何遍历一个对象里的所有元素? 学习笔记: for 循环与while循环的区别 for循环的定义 使用for循环遍历序列 使用for循环遍历字典…...
HTTP1.0和HTTP1.1有什么区别
HTTP/1.0 和 HTTP/1.1 是两个不同版本的 HTTP 协议。虽然它们的核心功能都是提供网页数据传输,但 HTTP/1.1 对 HTTP/1.0 做了很多改进,提升了性能和灵活性。以下是它们的主要区别: 1. 持久连接(Persistent Connection)…...
卡夫卡的理解
一、架构理解 在这个单聊新架构中,涉及多个服务器组件共同协作来实现单聊功能。 ChatAccessServer:可能负责处理单聊相关的访问请求,比如用户登录单聊以及发送单消息的请求接入。ChatHttpPushServer:推测其用于通过 HTTP 协议推…...
基础算法之滑动窗口--Java实现(上)--LeetCode题解:长度最小的子数组-无重复字符的子串-最大连续1的个数III-将x减到0的最小操作数
这里是Thembefue 今天讲解算法中较为经典的一个算法 > 滑动窗口 本讲解主要通过题目来讲解以理解算法 讲解分为三部分:题目解析 > 算法讲解 > 编写代码 滑动窗口 在正式进入题目的讲解之前,得先了解一下什么是滑动窗口,以及应该在什…...
Linux -- 文件系统(文件在磁盘中的存储)
目录 前言: 了解机械磁盘 初始盘片与磁头 盘片是怎么存数据的呢? 详解盘片 如何访问磁盘中的一个扇区呢? -- CHS 定位法 磁盘的逻辑存储 LBA(Logical Block Addressing --- 逻辑块寻址) 如何将 LBA 地址转换为…...
微服务(Microservices),服务网格(Service Mesh)以及无服务器运算Serverless简单介绍
文章目录 什么是微服务?一、定义与特点二、优势三、组件与架构四、应用场景五、挑战与解决方案什么是服务网格?一、定义与特点二、核心组件三、主要功能四、实现工具五、应用场景六、优势与挑战什么是Serverless?一、定义与特点二、主要领域三、优势四、应用场景五、挑战三者…...
【AIGC】AI时代的数据安全:使用ChatGPT时的自查要点
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯法律法规背景中华人民共和国保守秘密法中华人民共和国网络安全法中华人民共和国个人信息保护法遵守法律法规的重要性 💯ChatGPT的数据使用特点ChatGPT数据安全…...
什么是区块链桥?
什么是区块链桥? 区块链桥是一种实现资产从一个区块链转移至另一个区块链的工具,它解决了区块链技术中不同网络之间缺乏互操作性的问题。区块链桥通过创建代表另一区块链资产的合成衍生品,使得原本互不兼容的区块链资产能够相互连接和转移。…...
机器学习框架
机器学习框架 机器学习框架是用于开发和部署机器学习模型的软件工具。它们提供了一组API和工具,帮助开发人员在各种计算设备上构建、训练和部署机器学习模型。以下是几个常见的机器学习框架: 1.TensorFlow: TensorFlow是一个开源的人工智能…...
金三银四:20道前端手写面试题
文章目录 一、前言二、题目1. 防抖节流解读 2.一个正则题3. 不使用a标签,如何实现a标签的功能4. 不使用循环API 来删除数组中指定位置的元素(如:删除第三位) 写越多越好5. 深拷贝解读 6. 手写call bind applycall 解读apply 解读 …...
RAC被修改权限及相关问题
RDBMS : 19.19 修改RAC权限及相关问题 修改RAC权限,参考文档: 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题排列硬币
题目: 题解: func arrangeCoins(n int) int {return sort.Search(n, func(k int) bool { k; return k*(k1) > 2*n }) }...
数学建模--什么是数学建模?数学建模应该怎么准备?
前言 这是去年底学数学建模老哥的建模课程笔记;未来本人将陆陆续续的更新数学建模相关的一些基础算法,大家可以持续关注一下;提示:数学建模只有实战才能提升,光学算法没有啥意义,也很难学的很懂。 文章目录…...
Java项目实战II基于Java+Spring Boot+MySQL的智能物流管理系统(源码+数据库+文档)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 随着电商行业的蓬勃发展,物流行业迎来了前所未有的机遇与挑战。面对日益增长的订单量和复…...
【数据分享】2000—2023年我国省市县三级逐月植被覆盖度(FVC)数值(Shp/Excel格式)
之前我们分享过2000—2023年我国250米分辨率逐月植被覆盖度(FVC)栅格数据(可查看之前的文章获悉详情),该数据来源于高吉喜等学者在国家青藏高原科学数据中心平台上分享的数据,合成方式采用月最大值合成&…...
《Linux从小白到高手》理论篇(十一):Linux的系统环境管理
值此国庆佳节,深宅家中,闲来无事,就多写几篇博文。本篇详细深入介绍Linux的系统环境管理。 环境变量 linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容。如果每…...
Qt/C++开源控件 自定义雷达控件
使用Qt框架创建一个简单的雷达图,包含动态扫描、目标点生成、刻度和方向标识。代码实现使用C编写,适合用作学习和扩展的基础。 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软件,大家自己去下啊! 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机,然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
