当前位置: 首页 > news >正文

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

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

复现代码示例:

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.mrgr.cn/news/5820.html

相关文章:

  • 浅谈Kafka(一)
  • 龙格-库塔法(Matlab实现)
  • 【Python机器学习】NLP概述——聊天机器人的自然语言流水线
  • 【vue3|第25期】Vue3中的useRoute:轻松访问路由信息
  • Baumer工业相机堡盟工业相机如何通过BGAPISDK初始化时过滤其它非Baumer相机(C++)
  • 实时手势识别(2)- 基于关键点分类实现零样本图片的任意手势的识别
  • 大数据面试-Zookeeper
  • Stable Diffusion【应用篇】【艺术写真】:超高相似度人物换脸写真,IP-Adapter与InstantID完美结合
  • docker安装mysql使用宿主机网络
  • vue3模拟生成并渲染10万条数据,并实现本地数据el-table表格分页
  • Ant-Design-Vue快速上手指南+排坑
  • IPO雷达丨具备独特产业链布局优势,港迪技术成长性较强
  • 我的新项目又来咯!
  • 超低排放验收流程的全方位指南
  • 为什么企业跨国组网建议用SD-WAN?
  • 前端宝典十二:node基础模块和常用API
  • 每日一问:为什么MySQL索引使用B+树? 第4版 (含时间复杂度对比表格)
  • 一NULL为甚?
  • Redis管道
  • 提升代码可读性的十八条建议2