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

devtools/2024/10/22 14:28:03/

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

复现代码示例:

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/devtools/99469.html

相关文章

海运整箱成本与拼箱成本对比 | 国际贸易服务平台 | 箱讯科技

整箱和拼箱 在集装箱运输业务中&#xff0c;我们把一个集装箱、一个出口人、一个收货人、一个目的港&#xff0c;满足这“四个一”条件的货物叫做整箱货&#xff0c;而把一个集装箱、出口人、收货人和目的港这三项之中只要有一项是在两个或两个以上的出口运输货物&#xff0c;就…

linux(arm)移植 macchanger

在ARM Linux平台上移植macchanger工具主要涉及从源代码编译该工具&#xff0c;‌并确保它在目标ARM设备上正确运行。‌macchanger是一个用于操纵网络接口MAC地址的小工具&#xff0c;‌常用于增强网络隐私和安全性。‌ 移植步骤 1.‌准备开发环境‌&#xff1a;‌ 确保你有一…

009 批量删除

文章目录 前端后端 https://element.eleme.cn/#/zh-CN/component/button 前端 <el-button type"danger" click"batchDelete">批量删除</el-button><el-treeref"menuTree"batchDelete() {console.log("批量删除菜单..."…

第九周:机器学习笔记

第九周机器学习周报 摘要Abstract机器学习——Spatial Transformer1.1 How to transform an image/feature map?&#xff08;怎么做&#xff09;1.2 Interpolation&#xff08;插值&#xff09;1.3 spatial Transformer的应用 Pytorch学习1. 线性层2. 其他层的介绍3. 搭建小实…

Stream Collectors.toMap 当value为null时报空指针

文章目录 Stream Collectors.toMap 当value为null时报空指针问题源码解决 Stream Collectors.toMap 当value为null时报空指针 问题 public class Demo {public static void main(String[] args) {List<Test> list new ArrayList<>();list.add(new Test("co…

Kubernetes全名及其缩写K8S的正确读音

Kubernetes&#xff0c;在希腊语意为“舵手”或“驾驶员”&#xff0c;在IT技术领域&#xff0c;这是一个开源系统&#xff0c;支持部署、扩缩和管理容器化应用。正如船长负责船舶在海上的安全航行一样&#xff0c;Kubernetes担负着安全编排和运送容器&#xff08;可理解为船上…

【线性相关 vs 双变量回归】数据点在斜率周围的聚集程度与斜率本身并不是一回事。

相关性分析(具体来说,皮尔逊成对相关性)和回归分析(具体来说,双变量最小二乘 (OLS) 回归)具有许多共同的特征: 两者都定期应用于两个连续变量(我们称之为 X 和 Y)。通常向学生介绍这两种图表时使用的是同一类型的图表:散点图。二者从根本上讲都是关于 X 中的偏差(即…

Android常见界面控件(二)

目录 ​前言 一、 RadioButton控件 设置RadioGroup的监听事件 二、CheckBox控件 三、Toast类 改变Toast窗口的提示位置 四、EditText控件 常用属性 前言 在上一篇中&#xff0c;我们讲解了三个常见的控件&#xff1a;TextView控件、Button控件、ImageView控件&#xf…