Arrays.asList() doubt?

2022-09-03 03:20:17

人们说这种方法将数组转换为列表,并且它不会复制,因此“aList”中的每个更改都会反映为“a”。因此,在“aList”中添加新值是非法的,因为数组具有固定大小。asList

但是,方法返回 。编译器如何区分第 3 行和第 5 行。第 3 行给了我例外 ()。asList()ArrayList<T>UnsupportedOperationException

        String[] a = {"a","b","c","d"};//1
        List<String> aList =  Arrays.asList(a);//2
        aList.add("e");//3
        List<String> b = new ArrayList<String>();//4
        b.add("a");//5

答案 1

您从中收到的此 List 实现是数组上的特殊视图 - 您无法更改其大小。Arrays.asList

的返回类型是 经常与 混淆。 只需将数组显示为列表Arrays.asList()java.util.Arrays.ArrayListjava.util.ArrayListArrays.ArrayList


答案 2

再读一遍,Arrays.asList 的类型是:

public static <T> List<T> asList(T... a)

它清楚地表明asList返回一个实现接口java.util.List的对象,没有任何地方说它将返回java.util.ArrayList类的实例。

接下来,请注意List.add上的文档说:

布尔加法(E e)

将指定的元素追加到此列表的末尾(可选操作)。

从技术上讲,每次使用类型为List(而不是ArrayList)的变量时,您都应该始终小心,期望此方法可能会引发 。如果您确定只会收到始终具有正确语义 的 List 实现,则可以在假设无效时忽略检查,但可能会发生 bug。UnsupportedOperationException.add()