Exception in thread "main" java.lang.UnsupportedOperationException


如果你嘗試修改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);
}

輸出:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM