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 異常。