今天在项目中遇到一个小问题,代码抽象成这样:
String[] strs = new String[] { "aaa", "bbb", "ccc" };
List<String> asList = Arrays.asList(strs);
asList.add("FFF");
System.out.println(asList.toString());
结果他报了一个“不支持的操作”异常,异常的行数是asList.add("FFF");
这一行:
Exception in thread "main" java.lang.UnsupportedOperationException
说明这个add()方法是不支持的!我们知道List接口是有定义add()方法的,那就是Arrays.asList(strs)
返回的List的实现类没有去实现List的add()方法咯?看一下asList()方法的返回:
他返回的是个Arrary$ArraryList,看看源码:
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
返回的是一个ArrayList<>,还跟我们平时用的ArrayList<>不太一样,那就看看这个ArrayList<>:
吓得我赶紧去看看java.util.ArrayList<>,嗯,果然不是同一个。此处这个是Arrays类内部定义的一个内部类。这个类的成员只有这个private final E[] a;
看到这个final 就知道不用想了,什么add(),remove()之类的方法肯定是没有的。再看看构造方法:
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
这不就是个数组嘛。
下回面试再有人问你ArrayList<>的数据结构,就告诉他,ArrayList<>是一个定长数组,嗯,我说的是Arrays类里面的那个ArrayList<>