java中创建不可变集合

news2024/12/26 23:35:04

一.应用场景

二.创建不可变集合的书写格式(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.coloradmin.cn/o/2184593.html

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

相关文章

鸿蒙开发选择表情

鸿蒙开发选择表情 动态评论和聊天信息都需要用到表情&#xff0c;鸿蒙是没有提供的&#xff0c;得自己做 一、思路&#xff1a; 用表情字符显示表情&#xff0c;类似0x1F600代表笑脸 二、效果图&#xff1a; 三、关键代码&#xff1a; // 联系&#xff1a;893151960 Colum…

蓝桥杯【物联网】零基础到国奖之路:十五. 扩展模块之双路ADC

蓝桥杯【物联网】零基础到国奖之路:十五. 扩展模块之双路ADC 第一节 硬件解读第二节 CubeMX配置第三节 代码编写 第一节 硬件解读 STM32的ADC是12位&#xff0c;通过硬件过采样扩展到16位&#xff0c;模数转换器嵌入到STM32L071xx器件中。有16个外部通道和2个内部通道&#xf…

PDF阅读器工具集萃:满足你的多样需求

现在阅读书籍大部分都喜欢电子书的形式了吧&#xff0c;因为小小的一个设备就能存下上万本书。从流传程度来说PDF无疑是一个使用最广的格式。除了福昕PDF阅读器阅读之外还有哪些好用的阅读工具呢/&#xff1f;今天我们一起来探讨一下吧。 1.福昕阅读器 链接一下>>www.f…

css3-----2D转换、动画

2D 转换&#xff08;transform&#xff09; 转换&#xff08;transform&#xff09;是CSS3中具有颠覆性的特征之一&#xff0c;可以实现元素的位移、旋转、缩放等效果 移动&#xff1a;translate旋转&#xff1a;rotate缩放&#xff1a;scale 二维坐标系 2D 转换之移动 trans…

SysML案例-清朝、火星人入侵地球

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 以下图形摘自Jon Holt和Simon Perry的SysML for Systems Engineering。 案例素材来自H. G. Wells在1898年&#xff08;没错&#xff0c;清朝&#xff09;出版的The War of…

Netty系列-7 Netty编解码器

背景 netty框架中&#xff0c;自定义解码器的起点是ByteBuf类型的消息, 自定义编码器的终点是ByteBuf类型。 1.解码器 业务解码器的起点是ByteBuf类型 netty中可以通过继承MessageToMessageEncoder类自定义解码器类。MessageToMessageEncoder继承自ChannelInboundHandlerAdap…

用于高频交易预测的最优输出LSTM

用于高频交易预测的最优输出LSTM J.P.Morgan的python教程 Content 本文提出了一种改进的长短期记忆&#xff08;LSTM&#xff09;单元&#xff0c;称为最优输出LSTM&#xff08;OPTM-LSTM&#xff09;&#xff0c;用于实时选择最佳门或状态作为最终输出。这种单元采用浅层拓…

CSS 盒子属性

1. 盒子模型组成 1.1 边框属性 1.1.1 四边分开写 1.1.2 合并线框 1.1.3 边框影响盒子大小 1.2 内边距 注意&#xff1a; 1.3 外边距 1.3.1 嵌套块元素垂直外边距的塌陷 1.4 清除内外边距 1.5 总结

使用YOLO11训练自己的数据集【下载模型】-【导入数据集】-【训练模型】-【评估模型】-【导出模型】

目录 前言&#xff1a;一、下载模型二、导入数据集三、训练自己的数据集四、验证数据集五、测试数据集 前言&#xff1a; YOLO11于2024年9月30日由YOLOv8团队正式发布&#xff0c;为了让我们能够趁热打铁早发论文&#xff0c;接下来让我们仔细研究一下如何使用YOLO11训练自己的…

通信协议感悟

本文结合个人所学&#xff0c;简要讲述SPI&#xff0c;I2C&#xff0c;UART通信的特点&#xff0c;限制。 1.同步通信 UART&#xff0c;SPI&#xff0c;I2C三种串行通讯方式&#xff0c;SPI功能引脚为CS&#xff0c;CLK&#xff0c;MOSI&#xff0c;MISO&#xff1b;I2C功能引…

六、输入输出管理

1.输入输出程序接口 由于各种设备的操作所提供的参数或者返回值都不同&#xff0c;也很难做到以设备独立性软件向上提供统一的接口&#xff0c;但是可以将设备进行分类&#xff0c;每一类设备由一种统一的接口操作。 ①字符设备接口 get/put 系统调用:向字符设备读/写一个字符…

Redis篇(Redis原理 - RESP协议)

目录 一、简介 二、Redis通信协议 基于Socket自定义Redis的客户端 三、Redis内存回收 1. 过期key处理 1.1. 惰性删除 1.2. 周期删除 1.3. 知识小结 2. 内存淘汰策略 一、简介 Redis是一个CS架构的软件&#xff0c;通信一般分两步&#xff08;不包括pipeline和PubSub&a…

【Linux系统编程】第二十六弹---彻底掌握文件I/O:C/C++文件接口与Linux系统调用实践

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、回顾C语言文件接口 1.1、以写的方式打开文件 1.2、以追加的方式打开文件 2、初步理解文件 2.1、C文件接口 3、进一步理…

街道办事处智慧查询系统方案——未来之窗行业应用跨平台架构

一、政务公开建设的必要性 1.1.1使用便捷 人民的生活因为科学技术的发展&#xff0c;发生了翻天覆地的变化&#xff0c;也是实现智能化社区发展的重要发展环节&#xff0c;并在触摸一体机设备的运用中&#xff0c;“社区办事查询软件”运用&#xff0c;基本能够实现***科学技…

【优选算法】(第十五篇)

目录 和为k的⼦数组&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 和可被K整除的⼦数组&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 和为k的⼦数组&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&am…

【EXCEL数据处理】000010 案列 EXCEL文本型和常规型转换。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000010 案列 EXCEL单元格格式。EXCEL文本型和常规型转…

TypeScript 算法手册 【归并排序】

文章目录 1. 归并排序简介1.1 归并排序定义1.2 归并排序特点 2. 归并排序步骤过程拆解2.1 分割数组2.2 递归排序2.3 合并有序数组 3. 归并排序的优化3.1 原地归并排序3.2 混合插入排序案例代码和动态图 4. 归并排序的优点5. 归并排序的缺点总结 【 已更新完 TypeScript 设计模式…

nature reviews genetics | 基因调控网络方法总结

–https://doi.org/10.1038/s41576-023-00618-5 Gene regulatory network inference in the era of single-cell multi-omics 留意更多内容&#xff0c;欢迎关注微信公众号&#xff1a;组学之心 研究团队和单位 Julio Saez-Rodriguez—Heidelberg University Ricard Arge…

Let‘s Encrypt 的几个常用命令

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

Proxmox使用tc给虚拟机限速,实现不对等网速——浪浪云

文章目录 前言第一步查看虚拟机的虚拟网卡名字第二部 设置上传速度限制第三部 设置下载速度限制第四部 验证是否成功查看队列调度器查看过滤器 第五步 如何解除网卡限速 前言 由于proxmox虚拟机限速只能限速对等&#xff0c;但是我想让下载和上传速度不对等&#xff0c;例如上传…