Arrays.asList()返回一個實現了List接口的類,可是不支持add,remove等改變尺寸的操做。java
Arrays.asList源碼以下數組
1 public static <T> List<T> asList(T... a) { 2 return new ArrayList<>(a); 3 }
這裏有一個大坑,我開始沒仔細看,覺得返回的就是java.util.ArrayList,可實際上此ArrayList是Arrays裏面的私有靜態內部類,代碼以下所示。dom
1 private static class ArrayList<E> extends AbstractList<E> 2 implements RandomAccess, java.io.Serializable 3 { 4 private static final long serialVersionUID = -2764017481108945198L; 5 private final E[] a; 6 7 ArrayList(E[] array) { 8 if (array==null) 9 throw new NullPointerException(); 10 a = array; 11 } 12 13 public int size() { 14 return a.length; 15 } 16 17 public Object[] toArray() { 18 return a.clone(); 19 } 20 21 public <T> T[] toArray(T[] a) { 22 int size = size(); 23 if (a.length < size) 24 return Arrays.copyOf(this.a, size, 25 (Class<? extends T[]>) a.getClass()); 26 System.arraycopy(this.a, 0, a, 0, size); 27 if (a.length > size) 28 a[size] = null; 29 return a; 30 } 31 32 public E get(int index) { 33 return a[index]; 34 } 35 36 public E set(int index, E element) { 37 E oldValue = a[index]; 38 a[index] = element; 39 return oldValue; 40 } 41 42 public int indexOf(Object o) { 43 if (o==null) { 44 for (int i=0; i<a.length; i++) 45 if (a[i]==null) 46 return i; 47 } else { 48 for (int i=0; i<a.length; i++) 49 if (o.equals(a[i])) 50 return i; 51 } 52 return -1; 53 } 54 55 public boolean contains(Object o) { 56 return indexOf(o) != -1; 57 } 58 }
能夠看到,確實沒有remove,add等方法的覆蓋,沿用的仍是AbstractList中的方法,因此在調用時會拋出UnsupportedOperationException。函數
若是有同窗說下面這句話也用到了Arrays.asList,能夠進行各類操做是怎麼回事呢[1]?this
List<Integer> list1 = new ArrayList<Integer>(Arrays.asList(ia));
spa
雖然Arrays.asList()返回的ia不能被修改,可是java.util.ArrayList的構造函數獨立地拷貝了ia中的數據到本身的數組裏,就是說ia的任何修改和list1都沒有任何的關係了,ia至關於給list1賦了初值而已。code