今天看Java編程思想看到容器這塊的時候,發現說了Arrays.asList方法的一些特別之處,因此寫篇博文來記錄一下。java
Arrays是一個數組的工具類,用於操做數組。編程
public static <T> List<T> Arrays.asList(T... a) 這是asList的方法定義。意思就是傳入類型爲T的數組或者多個T類型的變量參數,就會返回一個List<T>的對象。數組
Java編程思想上是這麼說的:"你能夠使用Arrays.asList方法的輸出做爲List使用,可是其底層表示的是數組,所以不能調整尺寸,若是你試圖用add和delete方法在列表中添加和刪除元素就有可能會引起去修改數組的尺寸嘗試,所以,你將會在運行時得到Unsupported Operation異常"。app
那麼,首先我來來經過簡單的測試來看看這句話的正確性:dom
public class ArraysTest { public static void main(String[] args){ List<Integer> aList = Arrays.asList(1,2); for(int i : aList){ System.out.println(i); } aList.add(3); } }
看一下運行的結果:
1 2 Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at com.zhu.util.ArraysTest.main(ArraysTest.java:17) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
好吧,果不其然。異常拋出! 接下來,咱們看看源碼,爲何會出現這種狀況
@SafeVarargs public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } /** * @serial include */ 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; } }
Arrays.asList返回的是自己靜態內部類ArrayList,而不是咱們常用的java.util.ArrayList。看看這內部類的實現,直接是將構造器傳進來的數組直接做爲存儲數據的基礎。而add和delete方法是用的是父類AbstractList的實現。
父類AbstractList中的add方法實現工具
public boolean add(E e) { add(size(), e); return true; } public void add(int index, E element) { throw new UnsupportedOperationException(); }
以此可見在AbstractList中是不支持add的實現的。 測試