Java Arrays.asList 和 new ArrayList(Arrays.asList()) 的對比

英文標題【Arrays.asList vs new ArrayList(Arrays.asList())】

概述

在本文章中,我們會對 Arrays.asList(array) 和 ArrayList(Arrays.asList(array)) 之間的區別進行一些對比。

Arrays.asList

首先我們對 Arrays.asList 方法進行一些查看和說明。你可以單擊上面的鏈接查看官方的 API。

通過 API 的文檔我們可以瞭解到,使用這個方法將會爲數組創建一個固定長度(fixed-size)List 對象。這個方法只是對 array 數組進行了一次包裝,以便於在程序中可以使用 List,在這個包裝中沒有數據被拷貝或者創建。

同時,我們也不能對新創建的 List 的長度進行修改,因爲添加或者刪除 List 中的元素是不被允許的。

然而,我們是可以對新創建的 List 中的數組中的元素進行修改的。需要注意的是,如果你對 List 中的元素數據進行了修改的話,那麼對應 Array 的數據也被改動了。

例如,考察下面的代碼,我們首先創建了一個數組,然後將數組包裝成了 List ,然後我們再對包裝成 List 後的一個元素進行了修改。

String[] stringArray = new String[]{"A", "B", "C", "D"};
List<String> stringList = Arrays.asList(stringArray);

現在我們對包裝後的的 List 的一個元素進行修改。

stringList.set(0, "E");
assertThat(stringList).containsExactly("E", "B", "C", "D");
assertThat(stringArray).containsExactly("E", "B", "C", "D");
stringList.add("F");

從輸出中,我們可以看到,我們修改 List 後,原始的 Array 也被修改了。

現在我們 List 和 Array 中的元素和順序都是完全一樣的。

現在我們嘗試向包裝後的 stringList 中插入一個新的元素。

stringList.add("F");

拋出的異常:

java.lang.UnsupportedOperationException
    at java.base/java.util.AbstractList.add(AbstractList.java:153)
    at java.base/java.util.AbstractList.add(AbstractList.java:111)

通過上面的代碼我們可以看到,這個時候如果你對 List 進行元素插入或者刪除的時候,程序將會拋出 java.lang.UnsupportedOperationException 異常。

ArrayList(Arrays.asList(array))

與 Arrays.asList 方法一樣,我們還可以使用 ArrayList<>(Arrays.asList(array)) 來從 Array 創建一個 List。

但是,與上面的方法不一樣的是,使用這個方法創建的 List 是一個從老的 Array 中數據拷貝過來的,這個新的 List 與老的 Array 不相干,對新 List 中數據的操作不會影響到老的 Array 中的數據。

換句話說,使用這種方法創建的 List 是可以對 List 中的元素進行添加和刪除操作的。

String[] stringArray = new String[]{"A", "B", "C", "D"};
List<String> stringList = new ArrayList<>(Arrays.asList(stringArray));

現在我們對創建後的新 List 中的一個元素進行修改操作。


stringList.set(0, "E");
  
assertThat(stringList).containsExactly("E", "B", "C", "D");

現在,我們再查看下 List 和 Array 數據中的區別。

assertThat(stringArray).containsExactly("A", "B", "C", "D");

從上面的輸出可以看到,老的 Array 中的數據沒有被修改。

你可以訪問 JDK source code 中的內容查看下源代碼。

我們可以從源代碼中看到 Arrays.asList 返回 ArrayList 的類型和 從 java.util.ArrayList 中返回的類型是不一樣的。

主要的不同就是 Arrays.asList 返回的 ArrayList 只對老的 Array 進行了包裝,沒有實現 add 和 remove 方法。

結論

本文章中的實驗主要對上面 2 種將數組轉換爲 List 的方法進行了對比。

 

array-01

 

主要不同的地方就是在於是否能夠對轉換後的數組進行元素的添加和刪除等常規操作。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章