Arrays.asList()返回的ArrayList添加元素报错:java.lang.UnsupportedOperationException

使用Arrays.asList()可以很方便把多个元素转换为List,如:

List<String> list = Arrays.asList("a","b","c");

但在后续的操作中,使用返回的list添加元素

list.add("d");

运行代码报错,错误类似于:

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)

本想着Arrays.asList()返回的应该是ArrayList,使用ArrayList的add()方法怎么会不支持此操作呢?

查看源码才发现Arrays.asList()返回的的确是ArrayList,但是并非java.util.ArrayList。源码如下:

Arrays.asList()返回ArrayList

public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

定位到ArrayList的实现:

private static class ArrayList<E> extends AbstractList<E>
    implements RandomAccess, java.io.Serializable{
    ...
    public int size() {...}
    public Object[] toArray() {...}
    public <T> T[] toArray(T[] a) {...}
    public E get(int index) {...}
    public E set(int index, E element) {...}
    public int indexOf(Object o) {...}
    public boolean contains(Object o) {...}
    public Spliterator<E> spliterator() {...}
    public void forEach(Consumer<? super E> action) {...}
    public void replaceAll(UnaryOperator<E> operator) {...}
    public void sort(Comparator<? super E> c) {...}
}

可以看到此ArrayList是在Arrays里实现的静态类。它继承于AbstractList,但是没有重写add()方法。

查看AbstractList的add()方法:

public boolean add(E e) {
    add(size(), e);
    return true;
}
public void add(int index, E element) {
    throw new UnsupportedOperationException();
}

在AbstractList的add()方法默认是会抛出UnsupportedOperationException,除非子类重写它。

总结:Arrays.asList()返回的列表是可读的,不支持写操作。

版权声明:著作权归作者所有。

相关推荐

Python:查询列表给定元素的索引

单一索引列表的index()函数返回列表里第一次遇到给定元素的索引。>>> ["a", "b", "c"].index("b") 1 多个索引如果需要返回给定元素的所有索引,则要遍历列表:indexes = [index for i

JavaScript监控元素外的点击事件隐藏元素

监控document的点击事件,使用jquery的closet排除指定元素以及其子元素的点击事件。function hideOnClickOutside(selector) {   $(document).on('click',function(event){     if (!$(event.target)

Java 9:List.of()与Arrays.asList()的区别

Java 9新增了List.of的集合工程方法。它与Arrays.asList区别如下:1、Arrays.asList返回的是可变的列表,而List.of返回的是不可变的列表List<Integer> list = Arrays.asList(1, 2, null); list.set(3, 3); //&