Java 不可变集合全面解析

Java中的不可变集合与堆污染问题解析 在Java 10中,新增了一组静态方法来创建不可修改的集合。这些方法包括Set.copyOf和Map.copyOf。这些方法返回的集合是不可修改的,任何尝试修改它们的行为(比如添加或删除元素)都会抛出。这些方法创建的是集合的浅拷贝,即集合元素(或在Map中是键/值)不会被复制/克隆,因此如果原始元素(如果是可变的)被更改,它们的变化会反映在新集合中,反之亦然。如果提供的集合包含null元素,这些方法会抛出。 阅读详情

在 Java 编程中,不可变集合是一种特殊类型的集合,一旦创建,其内容就不能被修改。这种特性使得不可变集合在某些场景下具有独特的优势。

创建不可变集合的应用场景

  1. 数据不可修改的场景:当某个数据不应该被修改时,将其防御性地拷贝到不可变集合中是一种很好的实践。例如,一些配置信息、常量数据等,将它们放在不可变集合中,可以确保在程序运行过程中其内容不会被意外修改。
  1. 安全调用不可信库:当集合对象需要被不可信的库调用时,使用不可变集合形式是安全的。因为不可变集合无法被外部修改,从而避免了被不可信代码篡改数据的风险。

简单理解

不可变集合的核心就是不想让别人修改集合中的内容,从而保证数据的安全性和稳定性。

创建不可变集合的书写格式

在 Java 的List、Set、Map接口中,都提供了静态的of方法,用于获取一个不可变的集合。具体方法如下:

方法名称

说明

static List of(E...elements)

创建一个具有指定元素的 List 集合对象

static Set of(E...elements)

创建一个具有指定元素的 Set 集合对象

static <K,V> Map<K, V> of(K k1, V v1, K k2, V v2,...)

创建一个具有指定键值对元素的 Map 集合对象

注意事项

  1. 不可变操作限制:通过of方法创建的不可变集合,不能进行添加、删除和修改操作。一旦尝试进行这些操作,将会抛出UnsupportedOperationException异常。
  1. Set 集合的唯一性:当使用of方法创建不可变的Set集合时,传入的参数必须保证唯一性。如果传入重复元素,在 Java 10 及以上版本会抛出IllegalArgumentException异常。
  1. Map 集合的键唯一性:在创建不可变的Map集合时,键必须是唯一的。如果传入重复的键,同样会抛出IllegalArgumentException异常。
  1. Map 集合的参数上限:Map接口的of方法,参数是有上限的,最多只能传递 20 个参数,即 10 个键值对。如果需要传递超过 10 个键值对对象,可以使用ofEntries方法。

创建 Map 的不可变集合

细节

  1. 键的唯一性:同上述注意事项,Map 集合中键不能重复。
  1. of 方法参数上限:最多传递 20 个参数,10 个键值对。
  1. ofEntries 方法:当键值对数量超过 10 个时,在Map接口中可以使用ofEntries方法。该方法接受一个Map.Entry数组作为参数。

示例代码

import java.util.HashMap;
import java.util.Map;

public class ImmutableMapExample {
    public static void main(String[] args) {
        /* 创建Map的不可变集合,键值对的数量超过10个*/
        //创建一个普通的Map集合
        HashMap<String, String> hm = new HashMap<>();
        hm.put("张三", "南京");
        hm.put("李四", "北京");
        hm.put("王五", "上海");
        hm.put("赵六", "北京");
        hm.put("孙七", "深圳");
        hm.put("M八", "杭州");
        hm.put("吴九", "字波");
        hm.put("翔古", "苏州");
        hm.put("刘…", "无锵");
        hm.put("陈二", "嘉兴");
        hm.put("aaa", "111");

        //利用上边的数据来获取一个不可变的集合
        // 方式一:使用ofEntries方法
        Map<String, String> map1 = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
        // 方式二:使用copyOf方法,更为简洁
        Map<String, String> map2 = Map.copyOf(hm);

        System.out.println("使用ofEntries创建的不可变Map: " + map1);
        System.out.println("使用copyOf创建的不可变Map: " + map2);
    }
}

在上述代码中,展示了两种创建键值对数量超过 10 个的不可变Map集合的方法,一种是使用ofEntries方法,另一种是使用Map.copyOf方法,copyOf方法更为简洁直观。

希望通过这篇笔记,能帮助大家更好地理解和使用 Java 中的不可变集合,在实际编程中根据具体场景选择合适的集合类型。如果在使用过程中有任何疑问,欢迎在评论区留言交流。

内容有进一步修改意见,比如增减示例、调整结构,欢迎随时告诉我。

LVGL(lv_table) LVGL中的lv_table是一个轻量级表格控件,用于显示行列式文本数据。它支持设置单元格内容/样式、行列调整、事件响应等基础功能,适用于参数配置、数据展示等场景。通过API可快速创建表格,设置行列数、填充数据,并自定义对齐方式与样式。但需注意默认无滚动条、行数限制等问题。该控件适合简单表格需求,复杂交互需结合自定义事件处理。 阅读详情

相关推荐

别让PEX和后仿真拖后腿:Calibre与Virtuoso ADE联调的那些‘坑’与最佳实践

本文深入探讨了Calibre与Virtuoso ADE在PEX寄生参数提取和后仿真联调中的常见问题与解决方案。针对DRC/LVS验证通过后出现的网表导入错误和仿真波形异常,提供了七大典型场景的实战经验,包括PEX提取模式选择、CalibreView生成细节、环境变量配置等关键环节的最佳实践,助力工程师高效完成芯片设计验证。

weixin_33695450的博客 393

Java不可变集合(超详解)

不可变集合,顾名思义,就是不可以被修改的集合。一旦该集合创建完毕,其长度和内容均不能改变(不能增加或者减少元素),只能查找集合内的元素。

jerryhao0216的博客 4693

MTK Linux DRM分析(八)- KMS drm_crtc.c

CRTC 在 Linux DRM 子系统中是显示控制的核心,负责时序生成、模式设置和管线的调度。理解其工作原理和 API 对于进行底层图形开发、调试显示问题或 simply understanding how your graphics stack works 都至关重要。

iTom1900 1349

java不可变集合

里面的数据出来进行拼接修改的,这些原有集合里面的也不会被更改。因为你是遍历出来的数据进行操作,这几个集合都差不多,就是set比较特殊。set集合元素不能重复和输出的元素是无序的。答:整个生命周期都不能被修改的集合,增删改都不可以。[程序员, 汉语言文学, 播音主持, 电商, 666][汉语言文学, 播音主持, 电商, 666, 程序员]都可以用of方法创建一个不可变的集合。{红buff=1, 蓝buff=2}3.实在想用里面的数据怎么办?2.不可变集合类型有几个?1.什么是不可变集合?

快乐学习 1451

AI数字人:口播与唇形同步的福音,支持本地部署/批量生成/口齿清晰

你也可以直接输入语音,虚拟化身会根据语音的节奏和语调,同步做出相应的动作和表情,表现更加生动。不过这依然是个值得关注的工具。借助先进的 AI 算法,Heygem 高精度捕捉五官、轮廓等特征,构建逼真的虚拟模型。同时,它还能克隆语音,捕捉人声的细微特征,支持多种语音参数设置,打造高度相似的音色效果。打开设置,调整镜像存储位置,镜像文件比较大70~80G,选择合适的盘,设置完成后点击“Apply & Restart”。数字人视频画面与声音高度同步,口型匹配自然流畅,智能优化音视频效果,带来极佳的视听体验。

m0_72580657的博客 5862

Mann-Kendall检验全解析:从原理到11种变体及Python实现

本文全面解析Mann-Kendall检验,从基础原理到应对自相关、季节性等复杂数据的11种关键变体,如Hamed-Rao修正、季节性MK和趋势自由预白化(TFPW)。详细阐述各方法的适用场景与数学原理,并提供完整的Python实战代码,帮助研究者针对不同数据特性选择最稳健的趋势分析方法。

weixin_29050271的博客 459

【Java】不可变集合

1、不可变集合的特点?定义完成后只能查询,不能修改 / 添加 / 删除2、如何创建不可变集合?ListSetMap接口中,都存在静态的of()可以创建不可变集合3、三种方式的细节List:直接用Set:元素不能重复Map:元素不能重复、键值对数量最多是10个,超过10个用ofEntries方法如果你的JDK版本大于等于10,可以用copyOf()简化代码。

qq_39921135的博客 1209

RK3588S之CPU--benchmark(一)

本章会基于RK3588S来介绍有关CPU常用的benchmark工具及测试过程

文艺小少年的博客 1499

面试题: Java中各个集合类的扩容机制

Java 中提供了很多的集合类,包括,collection的子接口list、set,以及map等。由于它们的底层构成不同,以及数据的构造为单列、多列、可重复、不可重复,导致其扩容机制也不尽相同。 一、List 获取ArrayList 容量大小的方法: public static int getArrayListCapacity(ArrayList<?> arrayLis...

喜欢历史的码农 1498

【微服务】Java 对接飞书多维表格使用详解

Java 对接飞书多维表格使用详解

congge_study的博客 1万+

OpenCV计算机视觉实战(12)——图像金字塔与特征缩放

图像金字塔技术通过对原始图像按不同分辨率进行多层次表示,不仅能提升计算效率,还能为图像融合、检测与识别提供多尺度特征。高斯金字塔 (Gaussian Pyramid) 用于构建多级低通图像,拉普拉斯金字塔 (Laplacian Pyramid) 则提取各层之间的细节信息。本节将深入介绍如何使用 OpenCV 构建高斯与拉普拉斯金字塔,并以经典的图像融合案例,展示图像金字塔在特征缩放与融合中的强大应用。

qq_30167691的博客 1404

Java 不可变集合

​ 是一个长度不可变,内容也无法修改的集合使用 Collections.unmodifiableXXX() 可以将一个已有的集合包装为不可变集合。Java 9 引入了更简洁的 List.of(), Set.of(), 和 Map.of() 方法,创建不可变集合时更方便。不可变集合在多线程环境中具有天然的线程安全性,并且可以防止意外修改数据。

qq_48763502的博客 909

PCL ——LevenbergMarquardt非线性最小二乘法拟合圆柱(C++详细过程版)

使用C++详细过程版实现的LevenbergMarquardt非线性最小二乘法拟合圆柱

点云侠的博客 607

Java 9不可变集合深度解析(你不知道的of()底层机制)

掌握Java 9集合高效创建与安全共享之道,深入解析of()方法实现不可变集合的核心机制。涵盖Java 9集合of()的不可变性保障、适用场景及性能优势,避免并发修改风险,提升代码健壮性。值得收藏

SimSolve的博客 392

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java开发者必知的集合优化技巧(Java 9 of()不可变集合深度解析)

掌握Java 9集合优化新方式,提升代码安全性与性能。深入解析Java 9 集合的 of () 不可变特性,涵盖创建不可变集合的适用场景、核心方法及线程安全优势,避免冗余封装。高效简洁,值得收藏。

CodeVibe的博客 803

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java 9不可变集合实战指南(of方法使用全解析)

掌握Java 9集合创建新方式,深入解析of()方法实现不可变集合的原理与应用。涵盖常用集合类型、线程安全优势及典型使用场景,避免修改异常。全面理解Java 9集合of()的不可变性,提升代码健壮性,值得收藏。

ByteGlow的博客 986

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Java 9集合新特性深度解析】:of()工厂方法创建不可变集合的5大陷阱与最佳实践

掌握Java 9集合新特性,高效创建不可变集合。详解Java 9 集合工厂方法 of () 不可变的适用场景、核心语法与性能优势,揭示常见使用陷阱及规避策略。提升代码安全性与简洁性,最佳实践值得收藏。

DebugLoom的博客 399

【Java 9集合新特性深度解析】:彻底掌握of()不可变集合的5大核心优势与避坑指南

掌握Java 9集合新特性,深入解析of()创建不可变集合的核心优势与常见陷阱。涵盖适用场景、语法规范及性能提升要点,全面理解Java 9集合of()的不可变性机制,避免运行时错误与内存泄漏。开发高效安全代码的必备指南,值得收藏。

SimProceed的博客 810

Java中使用Guava库创建不可变集合的示例

Java中使用Guava库创建不可变集合的示例

Leon_Jinhai_Sun的博客 412

Java 17核心新特性解析:模式匹配与不可变集合实战

通过List.of()、Set.of()等新方法创建的集合,天生具备线程安全特性。值得注意的是,尝试修改这些集合会立即抛出UnsupportedOperationException,这种fail-fast机制能快速暴露设计缺陷。实测显示,在64G堆内存环境下,ZGC能将STW时间控制在10ms以内。体验Java 17新特性时,发现其AI辅助功能可以自动生成符合新语法的示例代码,省去了手动调试的时间。平台的一键部署更是让特性演示变得简单,不用配置环境就能实时查看运行效果,对快速验证新功能特别有帮助。

TurquoiseSea98的博客 256

java 静态工厂_Java 9静态工厂方法创建不可变集合

Java 9在集合API中引入了新的工厂方法,使开发人员更容易创建不可变的集合。在本文中,我将首先解释包含新工厂方法的动机,然后介绍所有方法、它们的用法和实现细节。告诉我,如何用Java 8或更少的初始键值对创建不可变的Map? 但这太冗长了,不是吗?我们能做点别的吗?其实你还有一个选择。您可以使用双大括号初始化语法来初始化不可变的Map,如下所示: 这有点冗长,但代价很高。双大括号技术的工作方式...

weixin_32407355的博客 195

笔记-java之不可变集合、异常处理

​​学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:想系统/深入学习某技术知识点…一个人摸索学习很难坚持,想组团高效学习…想写博客但无从下手,急需写作干货注入能量…热爱写作,愿意让自己成为更好的人……...

weixin_49141743的博客 164

Java 9 of()方法详解:如何安全高效地创建不可变集合?

掌握Java 9集合工厂方法of(),轻松创建不可变集合。适用于List、Set等场景,语法简洁且线程安全,有效避免修改异常。了解of()方法的使用技巧与优势,提升代码健壮性,值得收藏。

ByteChat的博客 432

Java 9之后你还手动封装不可变集合?of()方法的7个你必须知道的优势

掌握Java 9集合的of()不可变特性,告别手动封装。适用于列表、集合、映射创建,语法简洁、线程安全、性能更优。7大优势解析助你高效编码,值得收藏。

CodeTrick的博客 742

java怎么确保集合不可改变

java怎么确保集合不可改变 有两种方式: Collections. unmodifiableCollection(Collection c) 方法创建的集合 使用Arrays.asList创建的集合 那么为什么这两种方式创建的集合就不能修改呢? 下边通过源码来看一下到底是为什么。 Collections. unmodifiableCollection(Collection c) 方法 ~~~java List list = new ArrayList<>(); list.add(1); l

冲冲冲的博客 593

不可变集合

Java中的不可变集合。

m0_46977298的博客 311
上一篇: 深入理解 Java 双列集合:Map 家族的探索与实践
下一篇: 深入理解 Java Stream 流:高效数据处理的利器
吉安.
博客等级 码龄4年 106粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值