一、Arrays.asList()返回结果的是什么?
让我们看看源码
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
asList()返回了ArrayList,不过它不是我们熟悉的ArrayList,而是Arrays类中的内部类Arrays$ArrayList。下面让我们看看它是什么?
public class Arrays {
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
....省略
}
}
二、Arrays$ArrayList使用add()的正确与否?
首先让我们来举个例子
String[] str = new String[] {"you", "wu"};
List list = Arrays.asList(str);
list.add("good");
add()可以正常工作吗?
答案是不能!抛出UnsupportedOperationException异常。
为什么会这样呢?
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable {
}
在Arrays$ArrayList的定义中它继承了AbstractList,在AbstractList中有这样一些方法
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
Arrays$ArrayList并没有重载这个方法,而是继承。这样就产生了异常。