1. 程式人生 > >Arrays.asList()使用中的問題

Arrays.asList()使用中的問題

今天在專案中遇到一個小問題,程式碼抽象成這樣:

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()方法的返回:
asList()方法的返回
他返回的是個Arrary$ArraryList,看看原始碼:

    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

返回的是一個ArrayList<>,還跟我們平時用的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<>