英文标題【Arrays.asList vs new ArrayList(Arrays.asList())】
在本文章中,我們會對 Arrays.asList(array) 和 ArrayList(Arrays.asList(array)) 之間的差別進行一些對比。
首先我們對 Arrays.asList 方法進行一些檢視和說明。你可以單擊上面的連結檢視官方的 API。
通過 API 的文檔我們可以了解到,使用這個方法将會為數組建立一個固定長度(fixed-size)List 對象。這個方法隻是對 array 數組進行了一次包裝,以便于在程式中可以使用 List,在這個包裝中沒有資料被拷貝或者建立。
同時,我們也不能對新建立的 List 的長度進行修改,因為添加或者删除 List 中的元素是不被允許的。
然而,我們是可以對新建立的 List 中的數組中的元素進行修改的。需要注意的是,如果你對 List 中的元素資料進行了修改的話,那麼對應 Array 的資料也被改動了。
例如,考察下面的代碼,我們首先建立了一個數組,然後将數組包裝成了 List ,然後我們再對包裝成 List 後的一個元素進行了修改。
現在我們對包裝後的的 List 的一個元素進行修改。
從輸出中,我們可以看到,我們修改 List 後,原始的 Array 也被修改了。
現在我們 List 和 Array 中的元素和順序都是完全一樣的。
現在我們嘗試向包裝後的 stringList 中插入一個新的元素。
抛出的異常:
通過上面的代碼我們可以看到,這個時候如果你對 List 進行元素插入或者删除的時候,程式将會抛出 java.lang.UnsupportedOperationException 異常。
與 Arrays.asList 方法一樣,我們還可以使用 ArrayList<>(Arrays.asList(array)) 來從 Array 建立一個 List。
但是,與上面的方法不一樣的是,使用這個方法建立的 List 是一個從老的 Array 中資料拷貝過來的,這個新的 List 與老的 Array 不相幹,對新 List 中資料的操作不會影響到老的 Array 中的資料。
換句話說,使用這種方法建立的 List 是可以對 List 中的元素進行添加和删除操作的。
現在我們對建立後的新 List 中的一個元素進行修改操作。
現在,我們再檢視下 List 和 Array 資料中的差別。
從上面的輸出可以看到,老的 Array 中的資料沒有被修改。
你可以通路 JDK source code 中的内容檢視下源代碼。
我們可以從源代碼中看到 Arrays.asList 傳回 ArrayList 的類型和 從 java.util.ArrayList 中傳回的類型是不一樣的。
主要的不同就是 Arrays.asList 傳回的 ArrayList 隻對老的 Array 進行了包裝,沒有實作 add 和 remove 方法。
本文章中的實驗主要對上面 2 種将數組轉換為 List 的方法進行了對比。

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