关于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 的方法

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

然后回归到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方法用来对集合进行添加和删除,看下图:

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

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

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

文章转载自: 柳~

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

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

相关推荐
爱吃生蚝的于勒34 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~38 分钟前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
脉牛杂德1 小时前
多项式加法——C语言
数据结构·c++·算法
一直学习永不止步2 小时前
LeetCode题练习与总结:赎金信--383
java·数据结构·算法·leetcode·字符串·哈希表·计数
wheeldown10 小时前
【数据结构】选择排序
数据结构·算法·排序算法
躺不平的理查德14 小时前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
阿洵Rain14 小时前
【C++】哈希
数据结构·c++·算法·list·哈希算法
Leo.yuan14 小时前
39页PDF | 华为数据架构建设交流材料(限免下载)
数据结构·华为
半夜不咋不困14 小时前
单链表OJ题(3):合并两个有序链表、链表分割、链表的回文结构
数据结构·链表
忘梓.15 小时前
排序的秘密(1)——排序简介以及插入排序
数据结构·c++·算法·排序算法