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);
}
输出: