zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    高性能MySQL学习总结二----常见数据类型选择及优化
    springboot admin图文+视频教程
    xxl-job图文教程+视频讲解
    mybatis-plus视频教程
    springcloud视频教程
    springcloud系统化学习图文+视频教程
    docker系统化学习图文+视频教程
    【分享】docker全套视频教程
    是用Git还是SVN?
    NOIP知识点汇总
  • 原文地址:https://www.cnblogs.com/BJUT-2010/p/5568653.html
Copyright © 2011-2022 走看看