发布于 5年前

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()返回的列表是可读的,不支持写操作。

©2020 edoou.com   京ICP备16001874号-3