Arrays.asList(T... t)为什么在从数组转成list的时候添加数据失败?java.lang.UnsupportedOperationException (源码剖析)附带解决方法

Arrays.asList(T… a)

       我先来介绍一下这个方法,这个方法是在 java.util 工具包中的 Arrays 工具类,里面有许多对数组/集合进行操作的方法。asList(T… a)就是其中的一个,这个方法可以让我们避免一些麻烦的操作,比如我们有一个数组,而我们又想通过集合的方式进行操作的时候,这个时候就可以使用这个方法,将数组快速地转变成为集合。
       好,我们先来看一段代码。也就是要介绍为什么会出现如下异常的代码:

    @Test
    public void testArrays(){
    
    
       Integer[] a =  new Integer[]{
    
    1,2,3,4,5};
        List<Integer> list = Arrays.asList(a);
        System.out.println(list);
        list.add(6);
        System.out.println(list);
    }

       可能有人会忍不住说出:这个我知道结果是[1,2,3,4,5,6],这有人什么难的?这不就是将数组转成集合,然后在集合中添加了一个元素么?结果肯定是这个。
       好,我先把运行的结果给大家粘出来:在这里插入图片描述
       看到代码的运行结果可能有人会问,为什么会出现这种问题,java.lang.UnsupportedOperationException(不支持的操作异常!)别慌,且听我慢慢道来~

问题剖析

       我们先点开asLIst(T… a)这个方法查看:
在这里插入图片描述
发现里面是创建了一个ArrayList对象,同时将入参a传入,然后我们接着看下一步,这一步才是关键->我们先看一下这个ArrayList究竟是何方神圣:在这里插入图片描述
原来这个ArrayList是Arrays的一个静态内部类,他继承了AbstractList这个抽象类,跟着我们先不聊这个抽象类,我们先看一下这个ArrayList的内部方法都有什么在这里插入图片描述
然后我们再去对比一下普通的ArrayList中的方法。
在这里插入图片描述
是不是发现少了好多对集合进行操作的方法,比如常用的add、remove、removeAll等等。

       从上述所说我们发现,我们使用Arrays.asList(T… a)这个方法后得出来的ArrayList并不是我们经常操作的ArrayList,我们得出来的ArrayList则是 Arrays中的静态内部类 ———>ArrayList。同时这个Arrays中的ArrayList继承的是 AbstractList,所以我们在调用 转换后的集合(Arrays中的静态内部类 ArrayList)中的add方法的时候是调用的它的父类 AbstractList 中的add方法。但是既然调用了父类中add方法,那又为什么会抛出不支持的操作异常呢?这个我们需要从它的父类说起,我们先看一下它的父类中的add方法:
在这里插入图片描述
它的父类中的add(E e)方法是调用了它内部的一个add(int index,E element)方法,同时再往下看,一旦这样使用就会抛出一个
UnsupportedOperationException (不支持的操作异常),然后我们再看一下AbstractList中其他的各个方法:

在这里插入图片描述
       然后看我们常用的remove方法和addAll方法,remove方法一旦调用,就会抛出 UnsupportedOperationException 异常,而addAll方法在调用的过程中,会通过foreach去循环调用上述的add(int index,E element)方法,也会抛出异常,所以到此大家就知道了,Arrays.asList(T… a)转换后的ArrayList是不能对集合本身进行增删操作的。

问题解决

看了上述问题之后可能会有很多小伙伴会有疑问,那该怎么样去操作转换后的集合呢?很简单,大家别忘了我们平时操作的ArrayList和Arrays.asList转换后的ArrayList都是继承于谁的?----AbastractList,所以我们只需要将转换后的ArrayList转成我们平时操作的ArrayList就行:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_16733389/article/details/114252388