问题

先看如下代码

  1. public static void main(String[] args) {
  2. List<Integer> ints = Arrays.asList(1,2);
  3. ints.add(3);
  4. System.out.println(ints);
  5. }

看起来丝毫没有问题,数组转为列表,然后用列表接收之后进行add操作。
还是图样图森破了。

  1. Exception in thread "main" java.lang.UnsupportedOperationException
  2. at java.util.AbstractList.add(AbstractList.java:148)
  3. at java.util.AbstractList.add(AbstractList.java:108)
  4. Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8

直接就报出了UnsupportedOperationException。

解析

那我们点进去看看Arrays.asList方法都干了哪些事情
image.png
嗯。。没毛病,new了一个ArrayList。
那如果是我们以为的结果可能要无解了。。。

等等。。

仔细看看
数组转列表之后操作,报出UnsupportedOperationException - 图2
点进去发现new的这个ArrayList根本不是我们常用的ArrayList,他是Arrays的一个内部类!再看,他是继承自AbstractList,add方法是由AbstractList方法提供的,我直接就是一个好家伙,调用就直接抛出一个UnsupportedOperationException异常。再看Arrays的内部类ArraysList根本没有重写add方法,那可不是会报错嘛。
image.png

image.png
image.png
那么问题来了,我们常用的ArrayList也是继承自AbstractList来的,那我们调用add方法为什么不会出问题呢?点开源码一探究竟。
image.png
image.png
答案就是ArraysList帮我们做了这件事情,重写了AbstractList的add方法,当然不会报错了。
最后,不太清楚,官方开发人员为什么要多此一举创建这样一个内部类,直接调用ArrayList不好吗?

解决方案

其实说到这里,解决方法显而易见,将Arrays的内部类的ArrayList转换成我们常用的ArrayList就可以正常操作了。

  1. List<Integer> list = new ArrayList<>(Arrays.asList(1,2));

image.png
又涨了一个小姿势。
数组转列表之后操作,报出UnsupportedOperationException - 图9