此ArrayList非Arraylist
前序
本人是一个比较喜欢看源码的人,平时一直在oneNote上面做笔记,记录下平时的心得或者遇到的bug。最近萌生了想要写博客的想法,在“想法要付诸与行动”的督促下,开始了我的第一篇文章,遇到的第一个问题,就是想写的内容太多了,以什么样的话题开始写那?最终将目光集中到了最常用的集合方面。打开了我的oneNote笔记本,第一眼看见的就是这个Arrays的内部类ArrayList的内容,根据笔记的内容写出了下面的这篇文章。
这只是一个开始,以后只要工作不忙,就来这里写一篇文章,在回顾之前的笔记的同时,留下工作中的点滴,启迪正在迷途的小伙伴!
备注:第一次写博客,排版很垃圾,敬请见谅。
一、首先看一段代码
String[] arr = {"q", "w", "e"};
List<String> fakeList = Arrays.asList(arr);
fakeList.add("r");
上面这段代码运行会出现什么结果那?
二、看下面运行结果:
java.lang.UnsupportedOperationException
居然报错了,于是我点开了asList方法,发现里面就是根据数组创建的一个ArrayList集合呀!
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
不明白的小伙伴,继续往下看。
========================================================
先给大家上一张Arrays工具类的结构图
1、在上面发现Arrays有一个内部类叫做ArrayList,并且继承了AbstractList类,如下面代码。
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
2、继续看下面这张图,发现里面缺少了很多ArrayList的方法,其中缺少的方法就有add方法。
3、既然这个内部类中没有add方法,我就去继承的父类AbstractList类中看一下,add方法,如下图。
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
上面就是fakeList中最终运行的add方法,
创建一个UnsupportedOperationException异常并抛出,和开始运行的结果一致。
三、结论:
- Arrays的asList方法创建的是Arrays$ArrayLsit的对象。
- Arrays$ArrayLsit属于List集合,但不属于ArrayList集合。
如果有小伙伴们把Arrays$ArrayLsit当成ArrayList集合用的,那做好加班改bug的准备吧。
四、但是我们平常是要用ArrayList集合的,既然asList方法达不到目的,怎么办?
只需要在加一步操作,代码如下
String[] arr = {"q", "w", "e"};
List<String> fakeList = Arrays.asList(arr);
ArrayList<String> arrayList = new ArrayList<>(fakeList);
虽然ArrayList没有根据数组的构造方法,但是有根据单列集合的构造方法。所以我们先把数组转成Arrays$ArrayLsit集合,然后在根据Arrays$ArrayLsit生成真正的ArrayList集合。