Arrays.asList的用法:

Arrays.asList 返回數組而非List。java

List的一個典型的特性就是其長度是可變的,咱們能夠很方便地對它進行插入和刪除元素的操做,這是它與數組所存在的一個很大的區別,後者的長度是固定的,並且咱們不能從數組中刪除元素,只能修改元素的值。數組

利用Arrays.asList(array)返回一個List,然而這個返回的是隻讀的List不支持add和remove的操做。dom

JDK文檔是這麼說的:函數

public static <T> List<T> asList(T... a) 返回一個受指定數組支持的固定大小的列表。(對返回列表的更改會「直接寫」到數組。)此方法同 Collection.toArray() 一塊兒,充當了基於數組的 API 與基於 collection 的 API 之間的橋樑。返回的列表是可序列化的,而且實現了 RandomAccess。此方法還提供了一個建立固定長度的列表的便捷方法,該列表被初始化爲包含多個元素: List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");this

能夠看出這是對數組的一個簡單包裝,提供了一個可按照List方式訪問的外殼而已,其本質仍是數組。url

若是用Arrays.asList(arrays)獲得的List往裏面插入數據時會報java.lang.UnsupportedOperationException 異常spa

Arrays.asList()返回的是List,並且是一個定長的List,因此不能轉換爲ArrayList,只能轉換爲AbstractList code

緣由在於asList()方法返回的是某個數組的列表形式,返回的列表只是數組的另外一個視圖,而數組自己並無消失,對列表的任何操做最終都反映在數組上. 因此不支持remove,add方法的對象


二、注意:繼承

       JDK 1.4對java.util.Arrays.asList的定義,函數參數是Object[]。因此,在1.4中asList()並不支持基本類型的數組做參數。

  JDK 1.5中,java.util.Arrays.asList的定義,函數參數是Varargs, 採用了泛型實現。同時因爲autoboxing的支持,使得能夠支持對象數組以及基本類型數組。

  不過在使用時,當傳入基本數據類型的數組時,會出現小問題,會把傳入的數組整個看成返回的List中的第一個元素

例如:

public static void main(String[] args){
  int[] a1 = new int[]{1,2,3};
  String[] a2  = new String[]{"a","b","c"};

   System.out.println(Arrays.asList(a1));
    System.out.println(Arrays.asList(a1).size());    
    System.out.println(Arrays.asList(a2));
    System.out.println(Arrays.asList(a2).size());
}
  打印結果以下:
  [[I@dc8569]//傳入基本數據類型的數組會把該數組做爲返回的list的第一個元素...
  1          //這裏是1,由於把整個int數組當成了list的第一個元素
  [a, b, c]  //傳入字符串類型的數組正常
  3          //正常


三、Arrays.asList源碼:

public static <T> List<T> asList(T... a) {
  return new ArrayList<T>(a);
}

這裏的ArrayList並非java.util.ArrayList,而是Arrays的內部類:

private static class ArrayList<E> extends AbstractList<E> implements
RandomAccess, java.io.Serializable {
   private static final long serialVersionUID = -2764017481108945198L;
  private final E[] a;
  ArrayList(E[] array) {
  if (array == null)
      throw new NullPointerException();
      a = array;
  }
  public int size() {
      return a.length;
  }
  public Object[] toArray() {
      return a.clone();
  }
  public <T> T[] toArray(T[] a) {
      int size = size();
      if (a.length < size)
           return Arrays.copyOf(this.a, size, (Class<? extends T[]>) a.getClass());
           System.arraycopy(this.a, 0, a, 0, size);
           if (a.length > size)
                  a[size] = null;
             return a;
           }
  
           public E get(int index) {
               return a[index];
           }
  
          public E set(int index, E element) {
               E oldValue = a[index];
               a[index] = element;
               return oldValue;
           }
  
           public int indexOf(Object o) {
               if (o == null) {
                   for (int i = 0; i < a.length; i++)
                         if (a[i] == null)
                              return i;
               } else {
                   for (int i = 0; i < a.length; i++)
                        if (o.equals(a[i]))
                             return i;
               }
                return -1;
           }
  
          public boolean contains(Object o) {
               return indexOf(o) != -1;
           }
     }
  咱們能夠看到該內部類繼承的是AbstractList,下面是AbstractList的add和remove方法源碼:
       public boolean add(E e) {
           add(size(), e);
           return true;
       }
  
       public void add(int index, E element) {
           throw new UnsupportedOperationException();
       }
 
        public E remove(int index) {
           throw new UnsupportedOperationException();
       }

  因此,當咱們對Arrays.asList返回的List進行添加或刪除時將會報 java.lang.UnsupportedOperationException 異常。 

相關文章
相關標籤/搜索