天空闲话 发表于 2024-8-22 12:47:42

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

关于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 的方法
https://img2023.cnblogs.com/blog/2794716/202408/2794716-20240822092302462-1781116115.png
看一下asList里面 new ArrayList的代码实现,就会发现这里的ArrayList并不是java.util.ArrayList中的单列聚集,而是Arrays工具类(java.util.Arrays)中的静态内部类ArrayList
https://img2023.cnblogs.com/blog/2794716/202408/2794716-20240822090507955-1458842624.png
https://img2023.cnblogs.com/blog/2794716/202408/2794716-20240822091108752-1913972649.png
然后回归到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方法用来对聚集进行添加和删除,看下图:
https://img2023.cnblogs.com/blog/2794716/202408/2794716-20240822091616669-975448553.png
也就是说我们可以调用get方法得到Arrays.asList返回的聚集元素,也可以set修改这里面的值,但是因为它没有add和remove方法所以无法对聚集进行增长和删除,这也是为什么会报错:UnsupportedOperationException(没有支持的方法)的缘故起因。
至此我认为Arrays.asList的问题就讲完了,但是在写这个示例的时候我发现了一个新的知识函数式接口,之前了解过,但是不是很认识。
假如你是为了明白Arrays.asList的问题,那么到这里就可以止步了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 关于Arrays.asList返回List无法新增和删除?