关于Arrays.asList返回List无法新增和删除?

news/2024/11/14 19:39:20/

这个是在写项目的时候发现的,然后就分析了一下源码,得其内部原理

复现代码示例:

public class ArraysAsList {public static void main(String[] args) {Integer[] array = {1, 2, 3, 4, 5};List<Integer> list = Arrays.asList(array);list.forEach(System.out::println);list.add(11);}
}

程序运行至list.add(11)时报错

Exception in thread "main" java.lang.UnsupportedOperationException

分析源码:

点击查看Arrays.asList源码,静态的返回 List 的方法

image-20240822092303194

看一下asList里面 new ArrayList的代码实现,就会发现这里的ArrayList并不是java.util.ArrayList中的单列集合,而是Arrays工具类(java.util.Arrays)中的静态内部类ArrayList

image-20240822090509143

image-20240822091109703

然后回归到Arrays.asList()方法,为什么这个方法生成的List集合无法在add和remove

因为这里返回的是一个 final 数组,数组本身就是不可变的,所以当调用Arrays.asList方法返回一个集合后,无法在对这个集合进行一些操作,这个是数组的特性

private final E[] a;ArrayList(E[] array) {a = Objects.requireNonNull(array);
}

至于为什么java.util包下的ArrayList的底层也是数组,但是它依然可以去add和remove,那是因为copy了,但是在Arrays下面的ArrayList静态内部类中,它并没有实现add和remove方法用来对集合进行添加和删除,看下图:

image-20240822091617505

也就是说我们可以调用get方法得到Arrays.asList返回的集合元素,也可以set修改这里面的值,但是因为它没有add和remove方法所以无法对集合进行增加和删除,这也是为什么会报错:UnsupportedOperationException(没有支持的方法)的原因。

至此我认为Arrays.asList的问题就讲完了,但是在写这个示例的时候我发现了一个新的知识函数式接口,之前了解过,但是不是很熟悉。

如果你是为了明白Arrays.asList的问题,那么到这里就可以止步了。

文章转载自: 柳~

原文链接:https://www.cnblogs.com/zhiliu/p/18373725

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构


http://www.ppmy.cn/news/1517291.html

相关文章

网络通信tcp

管道通信与数据复制管道通信确实涉及数据复制的过程&#xff0c;这是由于管道的工作原理所决定的。下面详细解释一下&#xff1a;管道通信的数据复制 1. 写入管道&#xff1a;•当一个进程通过 write() 系统调用向管道写入数据时&#xff0c;数据实际上是从进程的用户空间复制…

PTA L1-010 比较大小

L1-010 比较大小&#xff08;10分&#xff09; 本题要求将输入的任意3个整数从小到大输出。 输入格式: 输入在一行中给出3个整数&#xff0c;其间以空格分隔。 输出格式: 在一行中将3个整数从小到大输出&#xff0c;其间以“->”相连。 输入样例: 4 2 8输出样例: 2-…

【单片机】PICC编译器和XC8编译器的历史发展,有什么关系

PIC 编译器的发展历史及其演变 在嵌入式系统开发领域,Microchip 的 PIC 微控制器因其广泛的应用、简单的架构和高效的性能,成为许多工程师和开发者的首选。在为这些微控制器编写代码时,编译器的选择至关重要。本文将介绍 Hi-Tech C 编译器(PICC)和 MPLAB XC 编译器的发展…

pyro 教程 时间序列 单变量,重尾,python pytorch,教程和实例 Forecasting预测,布朗运动项、偏差项和协变量项

预测I:单变量&#xff0c;重尾 本教程介绍了预测模块&#xff0c;用Pyro模型进行预测的框架。本教程只涵盖单变量模型和简单的可能性。本教程假设读者已经熟悉慢病毒感染和张量形状. 另请参见: 预测II:状态空间模型 预测三:层次模型 摘要 要创建预测模型: 创建预测模型班级…

网络安全系统性学习路线「全文字详细介绍」

&#x1f91f; 基于入门网络安全打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 一、基础与准备 网络安全行业与法规 想要从事网络安全行业&#xff0c;必然要先对行业建立一个整体的认知&#xff0c;了解网络安全对于国家和社会的作用&#xff0…

裸金属机的算力共享支持怎么实现

目录 裸金属机的算力共享支持怎么实现 一、技术架构 二、资源调度 三、安全保障 四、应用场景适配 裸金属机通过ssh实现远程调度 1. SSH配置 2. 远程登录 3. 远程命令执行 4. 自动化脚本 5. 安全注意事项 裸金属机的算力共享支持怎么实现 裸金属机的算力共享支持实…

探索数据结构:图(三)之最短路径算法

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 最短路径算法 最短路径问题可分为单源最短路径和多源最短路径。其指…

neo4j+es知识库管理系统(源码)

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 为什么建立知识库平台&#xff1f; 助力企业…