陣列轉換為List(Arrays.asList)後add或remove出現UnsupportedOperationException
從別的部落格上看到了出現這種情況的分析,我也不再自己從頭分析了,附上大神分析好的。
Java中,可以使用Arrays.asList(T... a)方法來把一個數組轉換為List,返回一個受指定陣列支援的固定大小的列表。此方法同 Collection.toArray()一起,充當了基於陣列的 API 與基於 collection 的 API 之間的橋樑。返回的列表是可序列化的,並且實現了 RandomAccess。
此方法還提供了一個建立固定長度的列表的便捷方法,該列表被初始化為包含多個元素:
List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
當轉換後,使用add或者remove方法總是丟擲java.lang.UnsupportedOperationException異常。
其底層的實現程式碼如下:
public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}
建立了一個ArrayList物件,而這個ArrayList並不是java.util包下面的ArrayList,而是java.util.Arrays類中的一個內部類,其實現程式碼如下:
private static class ArrayList<E> extends
private final E[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
而這個ArrayList類又繼承了AbstractList類,其中的add和remove方法的實現過程又如下:
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}
所以,肯定為出現不支援操作的異常。
那麼,一種解決辦法是把列表再拷貝到ArrayList中就好了。
ArrayList newList = new ArrayList<>(list);就可以使用add()和remove()方法了。