asList和ArrayList不得不說的故事

asList和ArrayList不得不說的故事java

簡介

提到集合類,ArrayList應該是用到的很是多的類了。這裏的ArrayList是java.util.ArrayList,一般咱們怎麼建立ArrayList呢?git

建立ArrayList

看下下面的例子: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

先講一下這個異常,UnsupportedOperationException是一個運行時異常,一般用在某些類中並無實現接口的某些方法。get

爲何上面的ArrayList調用add方法會拋異常呢?it

asList

咱們再來詳細的看一下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
相關文章
相關標籤/搜索