Arrays.asList()使用中的問題
阿新 • • 發佈:2018-12-14
今天在專案中遇到一個小問題,程式碼抽象成這樣:
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<>