Java中Arrays.asList()返回的list集合不能对add、remove方法进行操作

以下示例代码:

public class Demo {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        list.remove(1);
        System.out.println(list.toString());
    }
}

运行会提示java.lang.UnsupportedOperationException异常

原因是:Arrays.asList()返回的ArrayList集合继承自AbstractList,并且同时实现RandomAccess和Serializable接口,如下所示。

private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable

由于以上这个ArrayList不是java.util包下的,而是java.util.arrays包下的,它是Arrays类自己定义的一个内部类,这个内部类没有实现add、remove方法,而是直接使用父类ArrayList里面的方法。

以下是父类AbstractList的定义:

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> 

它里面add、remove方法如下所示:

public void add(int index, E element) {
      throw new UnsupportedOperationException();
}
public E remove(int index) {
      throw new UnsupportedOperationException();
}

这两个方法都返回这个异常

总结:Arrays.asList()返回的ArrayList继承自AbstractList,它仅支持那些不会改变数组大小的操作,所以任何对底层数据结构的尺寸进行修改的方法都会出现异常,Arrays.asList()返回固定尺寸的List

那么如何才能避免这个错误呢?

 ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

thinking in java给的解释是:把Arrays.asList()的结果作为构造器的参数传递给任何Collection。

参考文章-------非常感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值