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");}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Let‘s Encrypt 的几个常用命令

Lets Encrypt 是免费的 ssl 证书提供商&#xff0c;在当前纷纷收费的形式下&#xff0c;这是一个良心厂家&#xff0c;虽然使用起来略微繁琐。坚决抵制某 cxxn 站&#xff0c;竟然开始有辣么多收费的东西。这里记录几个常用的命令&#xff08;使用环境Ubuntu 24&#xff09;&am…

MySQL高阶2041-面试中被录取的候选人

目录 题目 准备数据 分析数据 总结 题目 编写解决方案&#xff0c;找出 至少有两年 工作经验、且面试分数之和 严格大于 15 的候选人的 ID 。 可以以 任何顺序 返回结果表。 准备数据 Create table If Not Exists Candidates (candidate_id int, name varchar(30), yea…

给大家提个醒!!!

前些天在某鱼买了一个KNX路由器&#xff0c;外观看起没什么问题&#xff0c;但内部就大跌眼镜了。 话不多说&#xff0c;直接上图 拿到手&#xff0c;外壳看起来没有什么问题 . 上电只亮灯 之后插网线&#xff0c;路由器上找不到设备 开壳&#xff0c;惊掉下巴 加个PHY…

利用自动化工具增强防火墙管理

在选择下一代防火墙以平衡安全需求和网络性能时&#xff0c;组织应优先考虑哪些因素&#xff1f; 最重要的部分——安全需求、可用性和网络性能必须保持平衡&#xff0c;而找到共同点并不总是那么容易。 选择防火墙时&#xff0c;组织必须采取的第一步是深入了解现有网络基础…

广联达 Linkworks办公OA Service.asmx接口存在信息泄露漏洞

漏洞描述 广联达科技股份有限公司以建设工程领域专业应用为核心基础支撑&#xff0c;提供一百余款基于“端云大数据”产品/服务&#xff0c;提供产业大数据、产业新金融等增值服务的数字建筑平台服务商。广联达OA存在信息泄露漏洞&#xff0c;由于某些接口没有鉴权&#xff0c…

基于 STM32F407 的串口 IAP

目录 一、概述二、IAP 实现三、IAP 程序1、串口部分2、iap 程序3、内部 flash 读写4、main 程序 IAP&#xff08;In Application Programming&#xff0c;在应用编程&#xff09;是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写。简单来说&#xff0c;就是开发者…

红外画面空中目标检测系统源码分享

红外画面空中目标检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

Spring Boot助力IT领域交流平台开发

2 系统关键技术 2.1 JAVA技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;…

vmvare虚拟机centos 忘记超级管理员密码怎么办?

vmvare虚拟机centos 忘记超级管理员密码怎么办?如何重置密码呢? 一、前置操作 重启vmvare虚拟机的过程中,长按住Shift键 选择第一个的时候,按下按键 e 进入编辑状态。 然后就会进入到类似这个界面中。 在下方界面 添加 init=/bin/sh,然后按下Ctrl+x进行保存退出。 init=/bi…

开放式耳机的优缺点?哪个品牌专业?好用的开放式蓝牙耳机分享

我相信很多想入手的开放式耳机的家人都想知道开放式耳机是什么&#xff0c;开放式耳机有什么优缺点&#xff0c;开放式耳机是不是智商税、值不值得购买以及如果要购买的话&#xff0c;有什么专业的开放式耳机品牌推荐。因为我毕竟是测评过三十多款开放式耳机的数码博主&#xf…

mdm监管锁系统功能说明

普通用户后台功能说明 设备管理 设备列表 添加的设备列表 点击序列号可以进入设备详细信息 可以修改设备使用人的姓名 手机号 分组等 还可以导出报表 设备信息 展示了一些设备信息和可以下发指令 指令说明 指令分为异步和非异步 下发指令是和手机设备有交互&#xff0c;一…

使用默认不可变的Rust变量会踩什么坑

讲动人的故事&#xff0c;写懂人的代码 Rust的变量真的是名不副实。名字中明明有个“变”字&#xff0c;却默认不可变。还美其名曰“不可变变量”。要想让变量名副其实&#xff0c;还必须费心额外加个mut关键字&#xff0c;并必须称其为“可变变量”&#xff0c;才能与前者区分…

【AI人工智能】文心智能体,陪爸妈去旅游,国庆假期不容错过,旅游搭子首选

文章目录 背景创作灵感陪爸妈去旅游简介角色与目标思考路径个性化开场白调优 智能体体验总结和感受 背景 文心智能体平台&#xff0c;开启新一轮活动&#xff0c;超级创造营持续百日活动。 在AI 浪潮席卷的今天&#xff0c;如雨后春笋般丛生的 AI 应用&#xff0c;昭告着时代风…

MySQL优化实战 解决CPU100%

问题表象 在24年初有一个日经问题困扰着我们&#xff0c;每到正点03分DB的CPU开始打满&#xff0c;持续1分钟又恢复正常水平。但由于日常业务交付压力较大且权限限制没有登录DB主机的权限&#xff0c;大家也就得过且过一直没有去认真排查。直到某天我来兴趣了也有时间了&#…

基于51单片机的家用防火防盗控制系统设计

本设计基于51单片机的家用防火防盗控制系统&#xff0c;该系统通过模块间的协同作用实现了对烟雾与天然气浓度的监测、温度监测、人体红外监测、通信传输、声光报警等功能。利用按键模块设置报警的阈值&#xff0c;将处理后的信息与阈值进行对比。判断气体浓度和温度是否超过阈…

酒店智能门锁SDK接口pro[V10] 门锁校验C#-SAAS本地化-未来之窗行业应用跨平台架构

一、代码 int 酒店标识_int Convert.ToInt32(酒店标识);StringBuilder 锁号2024 new StringBuilder(8);//信息 "未知返回值&#xff1a;" bufCard_原始;GetGuestLockNoByCardDataStr_原始(酒店标识_int, bufCard_原始.ToString(), 锁号2024);StringBuilder 退…

C++语言学习(4): identifier 的概念

1. 什么是 identifier identifier 中文意思是标识符&#xff0c;在 cppreference 中明确提到&#xff0c;identifier 是任意长度的数字、下划线、大写字母、小写字母、unicode 字符 的序列&#xff1a; An identifier is an arbitrarily long sequence of digits, underscores…

nginx打包部署前端vue项目全过程【保姆级教程】

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

Python字符串string方法大全及使用方法[1]以及FastAPI框架文件上传的处理-client使用postman

一、Python字符串string方法大全及使用方法[1] 1. Python字符串string方法大全及意义解释 #将字符串的第一个字符转换为大写 capitalize() #返回一个指定的宽度 width 居中的字符串&#xff0c;fillchar 为填充的字符&#xff0c;默认为空格。 center(width, fillchar) #返…