1. 程式人生 > >陣列轉換為List(Arrays.asList)後add或remove出現UnsupportedOperationException

陣列轉換為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

 AbstractList<E>   implements RandomAccess, java.io.Serializable  {    private static final long serialVersionUID = -2764017481108945198L;

  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()方法了。