ToB企服应用市场:ToB评测及商务社交产业平台

标题: 关于Arrays.asList返回List无法新增和删除? [打印本页]

作者: 天空闲话    时间: 2024-8-22 12:47
标题: 关于Arrays.asList返回List无法新增和删除?
关于Arrays.asList返回的List无法新增和删除?

这个是在写项目的时候发现的,然后就分析了一下源码,得其内部原理
复现代码示例:
  1. public class ArraysAsList {
  2.     public static void main(String[] args) {
  3.         Integer[] array = {1, 2, 3, 4, 5};
  4.         List<Integer> list = Arrays.asList(array);
  5.         list.forEach(System.out::println);
  6.         list.add(11);
  7.     }
  8. }
复制代码
程序运行至list.add(11)时报错
  1. 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方法返回一个聚集后,无法在对这个聚集进行一些利用,这个是数组的特性
  1. private final E[] a;
  2. ArrayList(E[] array) {
  3.     a = Objects.requireNonNull(array);
  4. }
复制代码
至于为什么java.util包下的ArrayList的底层也是数组,但是它依然可以去add和remove,那是因为copy了,但是在Arrays下面的ArrayList静态内部类中,它并没有实现add和remove方法用来对聚集进行添加和删除,看下图:

也就是说我们可以调用get方法得到Arrays.asList返回的聚集元素,也可以set修改这里面的值,但是因为它没有add和remove方法所以无法对聚集进行增长和删除,这也是为什么会报错:UnsupportedOperationException(没有支持的方法)的缘故起因。
至此我认为Arrays.asList的问题就讲完了,但是在写这个示例的时候我发现了一个新的知识函数式接口,之前了解过,但是不是很认识。
假如你是为了明白Arrays.asList的问题,那么到这里就可以止步了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4