为什么Arrays.asList()返回的列表不能增加元素

最后编辑于 2020-04-10
1
2
3
String[] arr = {"A", "B"};
List<String> list = Arrays.asList(arr);
list.add("C");	//java.lang.UnsupportedOperationException

如果调用Arrays.asList()方法返回列表的add方法会抛出异常,这是什么原因呢?

asList方法源码可以看到

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

返回的是一个ArrayList列表,然而这个ArrayList跟常用的java.util.ArrayList并不是同一个东西

java.util.Arrays.ArrayList

java.util.ArrayList

也就是说Arrays.asList()返回的并不是可扩容的那个ArrayList,而是在Arrays类内部写的另一个ArrayList,可以看到这两个ArrayList都继承了AbstractList<T>接口。

跳转到AbstractList<T>接口的add()方法定义处可以看到

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

默认就是不支持add操作的。

而上面的注释也写到:

Note that this implementation throws an UnsupportedOperationException unless {add(int, Object) add(int, E)} is overridden.
// 除非add操作被重写否则不支持add操作

而因为java.util.ArrayList重写了add方法,java.util.Arrays.ArrayList没有重写,所以Arrays.asList()返回的列表不支持该操作。

参考链接:

Arrays.asList使用指南-简书