写点什么

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

作者:EquatorCoco
  • 2024-08-22
    福建
  • 本文字数:824 字

    阅读完需:约 3 分钟

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


复现代码示例:

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

体验地址:http://www.jnpfsoft.com/?from=infoq

用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
关于Arrays.asList返回List无法新增和删除?_数据结构_EquatorCoco_InfoQ写作社区