以下示例代码:
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。
参考文章-------非常感谢!