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

news/2024/12/26 15:14:00/文章来源:https://www.cnblogs.com/zhiliu/p/18442641

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

复现代码示例:

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,那是因为它的add和remove方法copy了新的数组,但是在Arrays下面的ArrayList静态内部类中,它并没有实现add和remove方法用来对集合进行添加和删除,如下所示:

image-20240822091617505

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

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

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

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

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

相关文章

探索JVM的ABC

序章 JVM 是什么?JVM 是 Java Virtual Machine 的缩写。 “它直接和操作系统进行交互,与硬件不直接交互,而操作系统可以帮我们完成和硬件进行交互的工作。” 各种语言(Java、Kotlin、Groovy、Scala 等)编写的程序,编译成字节码,再加载到JVM中运行。 通过 JVM,程序员可以…

微积分快速入门6部分:阿基米德公式

15 发现阿基米德公式 在前面的课程中,我们揭示了一些微积分关系,即系统如何变化的 “算术”:这些规则对我们有什么帮助?如果我们已经有了一个等式,那么这些规则就是我们找到逐步模式的捷径。幂次法则让我们不再把一个增长的正方形或立方体看成是一个图形,而是让我们通过x…

暗黑破坏神2(Diablo II) D2BS kolton bot使用图文教程

暗黑破坏神2的bot,无疑最强大的是kolbot,它可以自动开荒自动升级。这里就是教朋友怎么设置这个bot。已经整合自动开荒(AutoSmurf)的D2BS kolton bot 文件的百度云盘下载地址: (适用于Diablo 2 1.14d) 链接:https://pan.baidu.com/s/1OXbFJbTwCrtpuyqf8ZqT5Q 提取码:db…

Windows应急响应-PcShare远控木马

Windows—PcShare远控木马应急思路分享。目录应急背景木马查杀1.查看异常连接2.查看进程3.查看服务定位到注册表开始查杀入侵排查1.账户排查2.开机自启3.服务4.计划任务5.网络情况6.进程排查重启再排查一遍 应急背景 曲某今天想要装一款软件,通过网上搜索看到非官方网站进入后…

Windows应急响应-灰鸽子远控木马

Windows—灰鸽子远控木马应急思路分享。目录应急背景木马查杀1.查看异常连接2.根据端口号查看对应进程文件3.排查异常服务4.发现启动项开始查杀入侵排查1.账号排查2.查看服务3.查看启动项4.查看计划任务5.网络情况6.进程排查重启再排查一遍 应急背景 历某今天刚入职公司,拿到公…

Xinference 安装使用(支持CPU、Metal、CUDA推理和分布式部署)

也支持多卡模型并行推理1. 详细步骤 1.1 安装 # CUDA/CPU pip install "xinference[transformers]" pip install "xinference[vllm]" pip install "xinference[sglang]"# Metal(MPS) pip install "xinference[mlx]" CMAKE_ARGS="…

KeyShot基础操作1

KeyShot的基本操作,包含视图、导入导出、各个面板简介等内容。注:学习此软件纯粹是工作中突然要我去对接模型厂家,厂家不能对外提供模型原件,于是就自己学了下这个软件渲染模型。--本篇导航--快捷键 视图操作(视图基本操作、几何图形视图) 模型导入、工程保存导出 各个面…

高级语言程序设计第二次个人作业

班级链接:https://edu.cnblogs.com/campus/fzu 作业要求链接:https://edu.cnblogs.com/campus/fzu/2024C/homework/13282 学号:102400130 姓名:杨子旭 章节习题在第四题的时候发现即使代码正确也无法输出正确结果,最后发现是win7系统原因,测试发现在win10的系统可以转为十…

YouTube 注释 All In One

YouTube 注释 All In OneYouTube 注释 All In One old YouTube 批注是在视频上添加文字层,链接或热点。 他们添加了链接到其他网站或视频的交互式框(您想要的任何链接)。https://zh-cn.aiseesoft.com/how-to/add-annotations-to-youtube.html将注释支持带回 YouTube™! 201…

AnimationClip优化工具 - 删除连续相同的帧

下图中Rotation.z的前4个关键帧[0, 3](即15帧, 30帧, 45帧, 60帧),值都没变; (3, 4)Rotation.z变为60(即61帧到90帧); 后3个关键帧[5, 7]一直维持在60没变。可以分析下:前4个关键帧,[1, 2]删除对动画没影响,后3个关键帧[5, 7]删除对动画也没影响。public class AnimC…

实验1 C语言输入输出和简单程序编写

一,实验目的 1. 会使用C语言程序开发环境(vs2010/devc++等),能熟练、正确使用它们编写、编译、运行、调 试C程序 2. 知道C程序结构和编码规范,能正确使用 3. 能正确、熟练使用C语言输入输出函数: scanf() , printf() , getchar() , putchar() 4. 能灵活、组合使用基本数据…

VScode Cmake-tools 部分问题记录

我的 Visual Studio Code 先前一直安装了 cpp-tools 和 cmake-tools。随后,我升级了我的 GCC 环境版本。然而,重新启动 Visual Studio Code 后,旧的 GCC 版本仍保留在工具包中。起初,我以为是 cpp-tools 插件的问题,一直无法解决这个 bug。后来卸载了相关插件后才发现是 c…