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赋了初值而已。

 

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

posted on 2016-06-07 23:11  北门煎饼东门串儿  阅读(145)  评论(0编辑  收藏  举报

导航