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

相关文章
相关标签/搜索