【从零开始学习JAVA | 第二十八篇】不可变集合

news2024/10/6 12:29:58

目录

目录

前言:

不可变集合:

常见的不可变集合:

1.创建list的不可变集合:

2.创建map的不可变集合:

应用场景:

总结:


前言:

        本文我们将为大家介绍JAVA中的不可变集合,它将内容锁死,不能随意改变内容,是JAVA中很常见的一个内容板块,大家要对此有较好的掌握程度。

不可变集合:

        在Java中,不可变集合是指一旦创建后就不能被修改的集合。这意味着不可变集合中的元素是固定的,无法添加、删除或修改。不可变集合的主要优势是线程安全和更高的性能

线程安全:

        线程安全是指在多线程环境下进行操作时,该操作能够正确地执行并且不会导致不一致或不确定的结果。简单来说,当多个线程同时访问或修改共享的数据时,线程安全保证了数据的正确性和一致性。

        线程安全是通过使用同步、锁、原子操作或线程安全的数据结构来保证多个线程之间共享数据的正确性和一致性。在多线程环境下,合理地处理线程安全问题可以避免出现竞态条件、数据竞争和死锁等问题。

常见的不可变集合:

1.创建list的不可变集合:

在Java中,有几种方法可以创建不可变的List集合:

1. 使用  Collections.unmodifiableList()  方法:

List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");

List<String> immutableList = Collections.unmodifiableList(list);

此方法将一个普通的可变List转换为不可变的List。尽管可以通过原始列表修改底层数据,但不可变列表上的修改操作将会抛出`UnsupportedOperationException`异常。

2. 使用  Guava的  ImmutableList.of()  方法:

ImmutableList<String> immutableList = ImmutableList.of("apple", "banana", "orange");

Guava库提供的`ImmutableList`类提供了一种简单而方便的方式来创建不可变列表。该方法接受任意数量的元素作为参数,并返回一个不可变的List集合。

3. 使用Java 9中新增的 List.of() 方法:

List<String> immutableList = List.of("apple", "banana", "orange");

在Java 9中,新增了`List.of()`方法,允许直接创建不可变的List集合。类似于Guava的`ImmutableList.of()`方法,它接受任意数量的元素作为参数,并返回一个不可变的List。

这些方法都可以创建不可变的List集合,保证集合的内容在创建后不能再被修改。需要注意的是,如果尝试在不可变列表上进行修改操作,将会抛出异常。因此,在选择使用哪种方法时,应根据情况和个人偏好进行选择。

2.创建map的不可变集合:

在Java中,有几种方法可以创建不可变的Map集合:

1. 使用  Collections.unmodifiableMap()  方法:

Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);

Map<String, Integer> immutableMap = Collections.unmodifiableMap(map);


此方法将一个普通的可变Map转换为不可变的Map。尽管可以通过原始映射修改底层数据,但不可变映射上的修改操作将会抛出`UnsupportedOperationException`异常。

2. 使用  Guava的ImmutableMap.of()  方法:

ImmutableMap<String, Integer> immutableMap = ImmutableMap.of("apple", 1, "banana", 2, "orange", 3);

Guava库提供的`ImmutableMap`类提供了一种简单而方便的方式来创建不可变的Map。该方法接受键值对作为参数,并返回一个不可变的Map集合。

3. 使用Java 9中新增的  Map.of()  方法:

Map<String, Integer> immutableMap = Map.of("apple", 1, "banana", 2, "orange", 3);

在Java 9中,新增了`Map.of()`方法,允许直接创建不可变的Map集合。类似于Guava的`ImmutableMap.of()`方法,它接受键值对作为参数,并返回一个不可变的Map。

这些方法都可以创建不可变的Map集合,保证集合的内容在创建后不能再被修改。需要注意的是,如果尝试在不可变映射上进行修改操作,将会抛出异常。因此,在选择使用哪种方法时,应根据情况和个人偏好进行选择。

应用场景:

不可变集合在许多场景中都有广泛的应用,以下是一些常见的应用场景:

1. 多线程环境:在多线程环境中,不可变集合是线程安全的。多个线程可以同时访问和读取不可变集合,而无需额外的同步机制。这样可以提高并发性能,并减少线程竞争和数据不一致性的问题。

2. 缓存:不可变集合在缓存中的应用非常常见。例如,使用不可变集合来存储缓存的数据,可以避免在缓存中发生数据修改和同步的问题。这样可以提高缓存的性能和可靠性。

3. 方法返回值:不可变集合可以作为方法的返回值,确保方法调用者无法修改返回的集合。这种方式可以提供安全性和稳定性,避免在方法调用过程中数据被意外修改。

4. 配置信息:不可变集合常用于存储配置信息。一次性加载配置信息到不可变集合中,可以确保配置信息不会被意外修改,并提供一致性和可靠性。

5. 哈希表的键:不可变集合可以作为哈希表的键,保证键的唯一性和哈希值的稳定性。由于不可变集合的元素不可变,所以可以确保哈希表中的键保持不变。

6. 函数式编程:在函数式编程中,不可变集合是很重要的概念。函数式编程鼓励使用不可变数据结构和纯函数,不可变集合可以确保没有副作用,并支持函数的组合和并发执行。

需要注意的是,虽然不可变集合在上述场景中是很有用的,但并不是适用于所有情况。在某些需要频繁修改和更新集合的场景中,可变集合可能更合适。因此,需要根据具体的应用需求和性能要求来选择使用可变集合还是不可变集合。

总结:

        不可变集合是指在创建后不可修改的集合,具有以下特点和优势:1. 数据的稳定性和一致性,避免了意外的修改。2. 线程安全,无需额外的同步操作。3. 高效的查询和检索,可以通过优化哈希和相等性操作提高性能。4. 可以安全用作键,提供更好的一致性和稳定性。5. 简化编码和维护,减少了防御性复制和同步操作的需要。不可变集合是一种可靠、高效且易于使用的数据结构,适用于需要保持数据不变性和线程安全性的场景。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

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

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

相关文章

第四十七章Java枚举(enum)详解:Java声明枚举类型、枚举(enum)类、EnumMap 与 EnumSet

枚举是一个被命名的整型常数的集合&#xff0c;用于声明一组带标识符的常数。枚举在曰常生活中很常见&#xff0c;例如一个人的性别只能是“男”或者“女”&#xff0c;一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时&#xff0c;就可以将它定义为…

今天实习第二天 ,vue

由于这是一次新的项目&#xff0c;有几个技术&#xff0c;docker&#xff0c;vue 老板要我学习vue。 这里我安装的是node.js&#xff0c;但是操作的时候用的是idea&#xff0c;因为vue插件集成在idea中。 01.vue的技术 vue是MVVM的履行者。 02.第一个vue程序 第一步&#xff1…

C基础day9(2023.7.11)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;实现字符串逆置 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {char str[]"hello";char *pstr;char *qstrstrlen…

UE编辑器灯光颜色,能量传入Shader流程

编辑器界面&#xff1a; 代码流程&#xff1a; FLinearColor ULightComponent::GetColoredLightBrightness() const {// Brightness in Lumensfloat LightBrightness ComputeLightBrightness();FLinearColor Energy FLinearColor(LightColor) * LightBrightness;if (bUseTem…

数学建模-拟合算法

这里的线性函数指的是参数为线性&#xff0c;而不是变量为线性。 yabx^2是线性的 用的比较多的是多项式拟合和自己定义的 拓展资料&#xff1a;工具箱曲线拟合类型评价解释 文件-导出代码 自动生成的代码修改图名和标签 如果不收敛&#xff0c;自己要修改初始值&#xf…

ES 跨集群搜索 Cross-cluster search (CCS)

跨集群查询 跨集群搜索(cross-cluster search)使你可以针对一个或多个远程集群运行单个搜索请求。 例如&#xff0c;你可以使用跨集群搜索来筛选和分析存储在不同数据中心的集群中的日志数据。 环境准备 角色IP系统dev172.16.122.244CentOS 7.9prod172.16.122.245CentOS 7.9 ES…

记忆——记忆宫殿——地点桩

地点桩图片 室内物品放置方法——时钟放置法 https://www.zhihu.com/question/34549534 地点桩的扩展和记忆 我告诉你一个让记忆宫殿数量翻125倍的方法&#xff0c;以后用一个地点桩就扔一个。 这方法是我在背了几本书后才在偶然中发现的&#xff0c;我叫他“五行推演法”&a…

ES(1)简介和安装

文章目录 简介倒排索引 安装 简介 ES是面向文档型数据库&#xff0c;一条数据在这里就是一个文档。 和关系型数据库大致关系如下: ES7.x中废除掉Type&#xff08;表&#xff09;的概念 倒排索引 要知道什么是倒排索引&#xff0c;就要先知道什么是正排索引 idcontent100…

判断数组中所有元素是否均为True numpy.alltrue()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 判断数组中所有元素是否均为True numpy.alltrue() [太阳]选择题 请问关于以下代码的说法错误的是&#xff1f; import numpy as np print(【执行】np.alltrue([True, True, True])) print(n…

C/C++图形库EasyX保姆级使用教程(四) 图片的展示与缩放

C/C图形库EasyX保姆级使用教程 第一章 Microsoft Visual Studio 2022和EasyX的下载及安装使用 第二章 图形化窗口设置以及简单图形的绘制 第三章 图形颜色的填充及相关应用 第四章 图片的展示与缩放 文章目录 C/C图形库EasyX保姆级使用教程前言一、图片的展示1.变量存储图片2.…

安全测试方法介绍(下)渗透测试

安全主要测试方法主要有&#xff1a;静态源代码审查&#xff0c;这个在编码阶段就可以进行&#xff0c;这个阶段如果出现问题&#xff0c;修复起来成本也比较低。程序发布之后可以进行渗透测试。前面的文章中我们为大家介绍了静态源代码审查的方法和策略&#xff0c;接下来本文…

【milvus】向量数据库,用来做以图搜图+人脸识别的特征向量

1. 安装milvus ref:https://milvus.io/docs 第一次装东西&#xff0c;要把遇到的问题和成功经验都记录下来。 1.Download the YAML file wget https://github.com/milvus-io/milvus/releases/download/v2.2.11/milvus-standalone-docker-compose.yml -O docker-compose.yml看…

微信小程序中常见组件的使用

文章目录 微信小程序中常见组件的使用视图组件viewscroll-viewswipermovable-area 基础组件icontextrich-textprogress 表单组件buttoncheckbox、checkbox-grouplabelforminputpicker单列选择器多列选择器时间选择器&日期选择器&地区选择器 picker-viewradiosliderswit…

人工智能-神经网络

目录 1 神经元 2 MP模型 3 激活函数 3.1 激活函数 3.2 激活函数作用 3.3 激活函数有多种 4、神经网络模型 1 神经元 神经元是主要由树突、轴突、突出组成&#xff0c;树突是从上面接收很多信号&#xff0c;经过轴突处理后传递给突触&#xff0c;突触会进行选择性向下一级的…

[项目实战] 使用Idea构建单页面Vue3项目(不使用node、npm)

前言 某天张三对小花说&#xff0c;我需要在一台新电脑上实现一个前端的漂亮页面&#xff1a;比如京东手机首页(m.jd.com)。 小花这时吭哧吭哧的去新电脑上安装nodejs、npm&#xff0c;然后在本地使用npm构建vue3项目&#xff0c;在项目里下载安装element-plus、axios。下一步…

常用异常检测算法总结与代码实现[统计学方法/K近邻/孤立森林/DBSCAN/LOF/混合高斯GMM/自编码器AutoEncoder等]

这篇博文主要是延续前文系列的总结记录&#xff0c;这里主要是总结汇总日常主流的异常检测算法相关知识内容。 &#xff08;1&#xff09;基于统计方法的异常值检测 基于统计方法的异常值检测是一种常用的异常检测算法&#xff0c;它基于样本数据的统计特性来识别与其他样本显…

【RS】ENVI5.6 栅格数据坐标转换

ENVI是一个完整的遥感图像处理平台&#xff0c;广泛应用于科研、环境保护、气象、农业、林业、地球科学、遥感工程、水利、海洋等领域。目前ENVI已成为遥感影像处理的必备软件&#xff0c;包含辐射定标、大气校正、镶嵌裁剪、分类识别、阈值分割等多种功能。ENVI针对绝大部分的…

【三相STATCOM】使用D-Q控制的三相STATCOM技术【三相VSI STATCOM为R-L负载提供无功功率】(Simulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

COMEN 科曼C60、C80心电监护仪协议对接

通过网口&#xff0c;成功对接到参数&#xff1a; HR、NibpDia、NibpMean、NibpSys、Spo2、Resp、Sys、Dia、Mean、Temp、PR等数值

flutter开发实战-flutter二维码条形码扫一扫功能实现

flutter开发实战-flutter二维码条形码扫一扫功能实现 flutter开发实战-flutter二维码扫一扫功能实现&#xff0c;要使用到摄像头的原生的功能&#xff0c;使用的是插件&#xff1a;scan 效果图如下 一、扫一扫插件scan # 扫一扫scan: ^1.6.01.1 iOS权限设置 <key>NSCa…