asList和ArrayList不得不說的故事java
提到集合類,ArrayList應該是用到的很是多的類了。這裏的ArrayList是java.util.ArrayList,一般咱們怎麼建立ArrayList呢?git
看下下面的例子:github
List<String> names = new ArrayList<>();
上面的方法建立了一個ArrayList,若是咱們須要向其中添加元素的話,須要再調用add方法。dom
一般咱們會使用一種更加簡潔的辦法來建立List:code
@Test public void testAsList(){ List<String> names = Arrays.asList("alice", "bob", "jack"); names.add("mark"); }
看下asList方法的定義:繼承
public static <T> List<T> asList(T... a) { return new ArrayList<>(a); }
很好,使用Arrays.asList,咱們能夠方便的建立ArrayList。接口
運行下上面的例子,奇怪的事情發生了,上面的例子竟然拋出了UnsupportedOperationException異常。element
java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java.util.AbstractList.add(AbstractList.java:108) at com.flydean.AsListUsage.testAsList(AsListUsage.java:18)
先講一下這個異常,UnsupportedOperationException是一個運行時異常,一般用在某些類中並無實現接口的某些方法。get
爲何上面的ArrayList調用add方法會拋異常呢?it
咱們再來詳細的看一下Arrays.asList方法中返回的ArrayList:
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
能夠看到,Arrays.asList返回的ArrayList是Arrays類中的一個內部類,並非java.util.ArrayList。
這個類繼承自AbstractList,在AbstractList中add方法是這樣定義的:
public void add(int index, E element) { throw new UnsupportedOperationException(); }
好了,咱們的問題獲得瞭解決。
咱們使用Arrays.asList獲得ArrayList以後,能不能將其轉換成爲java.util.ArrayList呢?答案是確定的。
咱們看下下面的例子:
@Test public void testList(){ List<String> names = new ArrayList<>(Arrays.asList("alice", "bob", "jack")); names.add("mark"); }
上面的例子能夠正常執行。
在java中有不少一樣名字的類,咱們須要弄清楚他們究竟是什麼,不要混淆了。
本文的例子https://github.com/ddean2009/learn-java-collections
歡迎關注個人公衆號:程序那些事,更多精彩等着您!
更多內容請訪問 www.flydean.com