1. 程式人生 > >數組轉集合

數組轉集合

cif span new arraylist 轉換成 需求 bject [] list

在Java中,數組和ArrayList是用於存儲元素列表的最常見的兩種數據結構。而且,經常需要在它們之間進行轉換。面對這樣高頻的一個轉換需求,我們有必要尋找到一種高效的方法。那麽什麽樣的轉換方式才是最高效的呢?本文將帶領大家一步一步推導出最後的答案。首先,我們把這個場景實例化為一個具體問題:如何把如下所示的 數組 轉換成 ArrayList ?

Element[] array = {new Element(1),new Element(2),new Element(3)};

技術分享

常見方法

對於熟悉 Arrays 工具類的讀者而言,可能會提出如下的這個解決方法:

ArrayList arrayList = new ArrayList(Arrays.asList(array));

針對此方法,我們首先查看一下 Java Doc 中對於 ArrayList 的構造方法是如何描述的:

ArrayList(Collection< ? extends E > c) : Constructs a list containing the elements of the specified collection, in the order they are returned by the colleciton’s iterator.

所以,ArrayList 的構造方法會執行如下的兩個操作:
1. 把 collection 轉換成一個 數組
2. 把 數組 中的所有元素拷貝到 ArrayList 的底層數組 elementData 中。

我們來直接看一眼 ArrayList 的構造函數的源碼:

public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;

if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}

錯誤方法

另一個簡單、直接的方法是:

List list = Arrays.asList(array);

這個方法似乎是最簡單。但是,該方法卻並不好,Arrays.asList 方法返回的 list 是一個固定大小的 List。實際上,此處返回的這個 list, 它的類型並不是我們常見的 java.util.ArrayList ,而是定義於 java.util.Arrays 內部的一個私有靜態內部類。我們知道 ArrayList 本質上是利用一個數組(array)來實現的,而且此處從 asList() 方法返回的這個 list 是固定大小的List,list 的大小由原始的數組大小決定。在此種情況下,如果我們在 list 的基礎上新增或者刪減元素,程序就會拋出一個 UnsupportedOperationException 異常。

list.add(new Element(4));
Exception in thread "main" java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
at collection.ConvertArray.main(ConvertArray.java:22)

終極方法

針對上述兩個方法的一些明顯缺點,有人提出了一個改進方法:

Element[] array = {new Element(1), new Element(2)};
List list = new ArrayList(array.length);
Collections.addAll(list, array);

這個方法利用 Collections 工具類的 addAll 方法,消除了“常見方法”中 數組轉Collection,Collection再轉數組 的這兩個冗余過程,同時,消除了“錯誤方法”中獲得的最終list是一個固定大小List的錯誤。

結論

實際上,這不是一個很難的問題,但確實一個非常有意思的問題。可能,每一個Java程序員都了解ArrayList,但是解決此問題的過程中,很可能會犯一些小錯誤。至於這三個方法的性能對比試驗,有興趣的讀者請自己嘗試。

轉:http://www.tiantianbianma.com/java-array-convert-arraylist.html/

數組轉集合