Arrays.asList 小结
Arrays.asList()返回一个实现了List接口的类,但是不支持add,remove等改变尺寸的操作。
Arrays.asList源码如下
1 public static <T> List<T> asList(T... a) { 2 return new ArrayList<>(a); 3 }
这里有一个大坑,我开始没仔细看,以为返回的就是java.util.ArrayList,可实际上此ArrayList是Arrays里面的私有静态内部类,代码如下所示。
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]?
List<Integer> list1 = new ArrayList<Integer>(Arrays.asList(ia));
虽然Arrays.asList()返回的ia不能被修改,但是java.util.ArrayList的构造函数独立地拷贝了ia中的数据到自己的数组里,就是说ia的任何修改和list1都没有任何的关系了,ia相当于给list1赋了初值而已。