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

目录

目录

前言:

不可变集合:

常见的不可变集合:

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.hqwc.cn/news/21476.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TDengine数据建模

文章目录 1 引言2 数据建模3 数据建模的步骤4 创建库5 创建超级表实例 1 引言 工业互联网中有大量的时序数据需要存储和处理&#xff0c;tdengine是一个开源的、国产的、云原生时序数据库&#xff0c;tdengine不是基于其他第三方开源软件高级封装&#xff0c;是涛思数据完全自…

MySQL练习题(6)

创建两个表插入数据 CREATE DATABASE beifen;use beifen;CREATE TABLE books(bk_id INT NOT NULL PRIMARY KEY,bk_title VARCHAR(50) NOT NULL,copyright YEAR NOT NULL);INSERT INTO booksVALUES (11078, Learning MySQL, 2010),(11033, Study Html, 2011),(11035, How to u…

TiDB简述及TiKV的数据结构与存储 | 京东物流技术团队

1 概述 TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库&#xff0c;是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品&#xff0c;具备水平扩容或者缩容、金融级高可用、实时 HTAP、…

从零开始制作一个Web蜜罐扫描器(2)

从零开始制作一个Web蜜罐扫描器(0)_luozhonghua2000的博客-CSDN博客 从零开始制作一个Web蜜罐扫描器(1)_luozhonghua2000的博客-CSDN博客 文件读取和写入实现 上面的工作已经完成了逻辑判断的部分,下面还需要进一步完善一些旁支末节的部分因为爬虫生成的文件是一个ison文件…

swin-transformer

面向视觉任务的transfomer Vision Transformer(ViT)在视觉任务中的局限性 需求数据量巨大 CNN中是图像整体输入&#xff0c;并且经过多年的演变&#xff0c;发展出了多个不同的优化策略。从而在学习时能够在一定先验知识的前提下拟合数据。 而transformer是将图像切割成若干较小…

Golang gui walk入门教程(一)安装walk环境

一、golang环境 Go 1.11.x or later 二、安装walk go get github.com/lxn/walk 三、安装rsrc 运行walk程序需要manifest&#xff0c;rsrc提供了这个功能 go install github.com/akavel/rsrc 安装完成后在GOPATH的bin下面会有一个rsrc.exe的可执行文件 在idea的termial输入r…

二维码生成器简单使用

生成器工具类 以下是一个简单的 QRCodeUtil 示例&#xff0c;这个工具类使用了 zxing 库来生成二维码图片&#xff1a; import com.google.zxing.BarcodeFormat; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter;import javax.image…

C语言、C++和C#:区别与特点的比较

C语言、C和C#是三种不同的编程语言&#xff0c;它们在以下几个方面存在区别&#xff1a; 设计宗旨&#xff1a;C语言是一种过程式编程语言&#xff0c;旨在提供高效的系统级编程。C是在C语言基础上发展而来的&#xff0c;既支持过程式编程&#xff0c;也支持面向对象编程。C#是…

出海企业系列风险分析--网站需要验证码吗?

最近接待了几位从discuz来的用户&#xff0c;说是想要给自己海外的网站安装验证码&#xff0c;但是discuz境外服务器还要解析安装中心的DNS到境外服务器上&#xff0c;所以基于discuz建站的不好之处就在这里。 而且我们还讨论到一个问题&#xff0c;海外的网站&#xff0c;需要…

C#制作打包安装程序,安装程序类使用

这里写目录标题 安装Microsoft Visual Studio Installer Projects创建安装项目设置安装程序文件设置程序桌面图标给程序设置安装程序名称安装程序类怎么使用Installer1.cs自定义安装步骤自定义设置安装程序路径&#xff0c;让用户安装时不能选择安装路径生成安装包 安装Microso…

数据结构(王道)——顺序表的基本操作(查找)

顺序表基本操作之按位查找&#xff1a; 顺序表基本操作之按值查找&#xff1a; 关于结构体类型是否相等的比较方法 顺序表查找总结&#xff1a;

Mysql select查询练习

1、查询出部门编号为30的所有员工&#xff1a; select * from emp where deptno30; 2、所有销售员的姓名、编号和部门编号&#xff1a; select ename,empno,deptno from emp where job销售员; 3、找出奖金高于工资的员工&#xff1a; select * from emp where comm > sai…