如果你嘗試修改Arrays.asList方法生產的List,那么就會報這個錯誤
public static void main(String[] args) { Integer[] arr = new Integer[]{7,8,9}; List<Integer> list = Arrays.asList(arr); list.add(4); }
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
--
看一下asList方法
/** * 返回一個固定長度的ArrayList * @param a * @param <T> * @return */ public static <T> List<T> asList(T... a) { return new Arrays.ArrayList<>(a); }
而這里返回的ArrayList,是Arrays工具類內部的一個私有內部類
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable { private static final long serialVersionUID = -2764017481108945198L; // 這里的數組是一個final的,說明這個數組結構不會發生改變,也就是定長數組 private final E[] a; ArrayList(E[] array) { a = Objects.requireNonNull(array); } ......
這個類繼承了AbstractList抽象類,只實現了get/set方法,但是沒有實現add/remove方法。而AbstractList里面的add/remove方法的默認邏輯是:
// add public boolean add(E e) { add(size(), e); return true; } public void add(int index, E element) { throw new UnsupportedOperationException(); } // remove public E remove(int index) { throw new UnsupportedOperationException(); }
所以 Arrays.asList(arr) 返回的List是無法增刪的,但是可以讀取和修改。
public static void main(String[] args) { Integer[] arr = new Integer[]{7,8,9}; List<Integer> list = Arrays.asList(arr); // list.add(4); // 可以調用List的方法 list.set(0, 1); // 也可以直接修改原數組 arr[1] = 2; arr[2] = 3; list.forEach(System.out::println); }
輸出: