此ArrayList非Arraylist

本文探讨了Java中Arrays工具类的内部ArrayList与普通ArrayList的区别,通过代码示例和源码分析揭示了Arrays.asList()方法创建的列表无法执行add操作的原因,提醒开发者注意两者在使用上的差异,避免潜在的编程错误。
摘要由CSDN通过智能技术生成

此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异常并抛出,和开始运行的结果一致。

三、结论:

  1. Arrays的asList方法创建的是Arrays$ArrayLsit的对象。
  2. 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集合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值