问题
先看如下代码
public static void main(String[] args) {
List<Integer> ints = Arrays.asList(1,2);
ints.add(3);
System.out.println(ints);
}
看起来丝毫没有问题,数组转为列表,然后用列表接收之后进行add操作。
还是图样图森破了。
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
直接就报出了UnsupportedOperationException。
解析
那我们点进去看看Arrays.asList方法都干了哪些事情
嗯。。没毛病,new了一个ArrayList。
那如果是我们以为的结果可能要无解了。。。
等等。。
仔细看看
点进去发现new的这个ArrayList根本不是我们常用的ArrayList,他是Arrays的一个内部类!再看,他是继承自AbstractList,add方法是由AbstractList方法提供的,我直接就是一个好家伙,调用就直接抛出一个UnsupportedOperationException异常。再看Arrays的内部类ArraysList根本没有重写add方法,那可不是会报错嘛。
那么问题来了,我们常用的ArrayList也是继承自AbstractList来的,那我们调用add方法为什么不会出问题呢?点开源码一探究竟。
答案就是ArraysList帮我们做了这件事情,重写了AbstractList的add方法,当然不会报错了。
最后,不太清楚,官方开发人员为什么要多此一举创建这样一个内部类,直接调用ArrayList不好吗?
解决方案
其实说到这里,解决方法显而易见,将Arrays的内部类的ArrayList转换成我们常用的ArrayList就可以正常操作了。
List<Integer> list = new ArrayList<>(Arrays.asList(1,2));
又涨了一个小姿势。