1. 程式人生 > >Java Arrays.asList注意事項

Java Arrays.asList注意事項

Arrays.asList用來將陣列轉化為List,這個看似功能很明瞭的方法卻暗藏玄機。 請先看下面的程式:

int[] datas = new int[]{1,2,3,4,5};
List list = Arrays.asList(datas);
System.out.println(list.size());

執行結果是1。一個長度為5的陣列,轉化為List後,長度卻成了1。 再對這個程式稍加修改:

Integer[] datas = new Integer[]{1,2,3,4,5};
List list = Arrays.asList(datas);
System.out.println(list.size());

執行結果為5。 同樣的程式碼,只是將陣列的型別由原來的基本型別改變為包裝型別,轉化後的List卻不一樣,這是為什麼? 看一下asList的程式碼:

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

asList接受的是一個泛型型別的引數,再構造了一個ArrayList。然而基本型別是不支援泛型化的,但是陣列支援,所以採用基本型別的陣列轉化後是將陣列放入了構造的ArrayList中,長度是1。 再接著看,這個坑過去了,興高采烈的想要往轉化後的List中新增些元素:

Integer[] datas = new Integer[]{1,2,3,4,5};
List list = Arrays.asList(datas);
list.add(6);

然後執行後卻丟擲了java.lang.UnsupportedOperationException異常,這是怎麼回事? 原來asList返回的ArrayList並不是我們熟悉的java.util.ArrayList,而是另一個類:

private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable

抽象類AbstractList 定義了一系列比如add()、remove()修改list的方法,然而在這個ArrayList中並沒有實現它們,所以返回的ArrayList是不支援修改操作的。 那麼如果想要對其進行add或者remove應該怎麼做呢?

Integer[] datas = new Integer[]{1,2,3,4,5};
ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(datas));

將其轉化為java.util.ArrayList即可。