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