1. 程式人生 > 實用技巧 >Java中Arrays.asList()返回的list集合增、刪報異常

Java中Arrays.asList()返回的list集合增、刪報異常

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這個靜態內部類中關鍵字查詢add和remove,發現沒有add和remove方法,那我們使用的asList的remove方法哪裡來的?點選asList的remove檢視,原來是java.util.Collection和java.util.List的remove方法,這就能理解了,呼叫其他類的方法去對這個asList進行操作,這不是用前朝的劍斬今朝的官嗎?!好傢伙,Arrays.asList,好大的官威啊!

總結:

通過Arrays.asList()方法返回的List並不是普通的List,而是Arrays工具類的一個內部類物件,而這個靜態內部類沒有重寫remove和add方法,所以無法使用add和remove方法對陣列轉化的集合進行增刪。

而這個靜態內部類沒有重寫remove和add方法,所以無法使用add和remove方法對陣列轉化的集合進行增刪。