Arrays.asList 小結

 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

 

[1]http://stackoverflow.com/questions/16748030/difference-between-arrays-aslistarray-vs-new-arraylistintegerarrays-aslistblog

相關文章
相關標籤/搜索