Arrays.asList后不支持元素的添加和删除

Arrays.asList后不支持元素的添加和删除。也就是不可以使用add、addAll和remove操作。

有时候经常需要把一个数组转换成List进行操作
大家常常都会使用Arrays的静态方法asList。
比如这样 List list = Arrays.asList(“a”, “b”, “c”);
然后经常就直接对集合进行元素的添加、删除操作了。
但是这样是不可以的,为什么不可以?
那我们试验一下看看会发生什么?

验证一下

1、第一步先用Arrays.asList将一个数组转换成一个List集合
2、第二步再用转换后的集合进行添加元素(add、addAll)和删除元素(remove)操作。每个动作都用try…catch捕获看是否发生异常。代码如下:

public static void main(String[] args) {
    List<String> list2 = Arrays.asList("a", "b", "c");
    try{
        list2.add("d");
    }catch (Exception e){
        e.printStackTrace();
    }

    try{
        List<String> list1 = new ArrayList<>();
        list1.add("e");
        list1.add("f");
        list2.addAll(list1);
    }catch (Exception e){
        e.printStackTrace();
    }

    try{
        list2.remove("a");
    }catch (Exception e){
        e.printStackTrace();
    }

    System.out.println(list2.size());
    System.out.println(list2);
}
运行结果发现出现三次UnsupportedOperationException异常
    java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at com.test.TestMain.main(TestMain.java:9)
java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
	at com.test.TestMain.main(TestMain.java:18)
java.lang.UnsupportedOperationException
	at java.util.AbstractList.remove(AbstractList.java:161)
	at java.util.AbstractList$Itr.remove(AbstractList.java:374)
	at java.util.AbstractCollection.remove(AbstractCollection.java:293)
	at com.test.TestMain.main(TestMain.java:24)
3
[a, b, c]

结论:确实是不支持元素的添加和删除操作的。但是为什么呢?
那就看一下Arrays类的asList方法到底有什么鬼?
查看源码发现Arrays类静态方法asList函数返回值类型是Arrays自定义的内部类。源码如下:

@SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

    /**
     * @serial include
     */
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }
        ....  还有很多其他方法这里省略
       }

然后再看看,该内部类ArrayList继承了AbstractList但未重写父抽象类里面的add、addAll和remove方法。所以调用add、addAll、remove方法实际上是调用了父类AbstractList中的方法。查看AbstractList发现这几个都未具体实现,直接返回了不支持操作异常即UnsupportedOperationException

public void add(int index, E element) {
    throw new UnsupportedOperationException(); // 这里也是直接返回不支持异常的
}

public boolean add(E e) {
    add(size(), e); // 这里调用add(int index, E element)所以也会抛不支持异常
    return true;
}


public E remove(int index) {
    throw new UnsupportedOperationException(); // 这里也是直接返回不支持异常的
}

public boolean addAll(int index, Collection<? extends E> c) {
    rangeCheckForAdd(index);
    boolean modified = false;
    for (E e : c) {
        add(index++, e); // 这里也调用add(int index, E element)所以也会抛出不支持异常
        modified = true;
    }
    return modified;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值