Java中Arrays.asList()返回的list集合增、刪報異常
阿新 • • 發佈:2020-12-16
Java中Arrays.asList()返回的list集合增、刪報異常
先上程式碼
@Test
public void test2() {
Integer[] arr = {10, 20, 30, 40, 50};
List asList = Arrays.asList(arr);
Iterator it = asList.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
asList.remove(0);
}
執行報錯:
原因分析:
檢視原始碼!
ctrl+滑鼠左鍵單擊,進入Arrays.asList()這個方法,先貼原始碼
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
可以看到,這裡返回了一個新的ArrayList物件,繼續點原始碼!
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); }
ok,這裡注意這個類private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
,這是個什麼類?通過瀏覽原始碼發現這是Arrays的一個靜態內部類,也就是說,通過Arrays.asList方法返回的ArrayList不是我們平常使用的那個繼承List介面的ArrayList,再在ArrayList
總結:
通過Arrays.asList()方法返回的List並不是普通的List,而是Arrays工具類的一個內部類物件,而這個靜態內部類沒有重寫remove和add方法,所以無法使用add和remove方法對陣列轉化的集合進行增刪。
而這個靜態內部類沒有重寫remove和add方法,所以無法使用add和remove方法對陣列轉化的集合進行增刪。