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

打印 上一主题 下一主题

主题 879|帖子 879|积分 2637

关于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企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表