问题1:Arrays.asList的结果不可修改
public static void main(String[] args) throws Exception {
String[] arr = new String[]{"1", "2", null, "a", "b", "c"};
List<String> list = Arrays.asList(arr);
list.add("8");
list.remove("a");
for (String str : list) {
System.out.println(str);
}
}
结果:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractList.add(Unknown Source)
at HelloWorld.main(HelloWorld.java:9)
源码分析:
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
说明:传入可变长度参数,实际上就是自定义泛型T类型的数组a作为形参。
# Arrays自定义的静态内部类ArrayList
/**
* @serial include
*/
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);
}
.........
}
// 检查对象不为空
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
说明:使用传入的数组作为内部数组的初始化。
# add方法在AbstractList父类中出现。
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
}
说明:Arrays自定义的静态内部类ArrayList根本就没有提供add方法。所以使用AbstractList抽象类实现的add方法抛出UnsupportedOperationException异常。
思考:
当修改数组的时候,那么同时Arrays.asList生成的List也将发生变化。原因:Arrays定义的静态内部类都是基于形参传入的数组。
网友评论