將java中數組轉換為ArrayList的方法實例(包括ArrayList轉數組)


方法一:使用Arrays.asList()方法

 

對於Arrays.asList()方法需要注意以下幾點:
1.該方法返回的是基於數組的List視圖(List view)。所以,這種方式是將數組轉換為List的最快的方式。因為返回的只是視圖,不需要多余的內存來創建新的List以及復制操作。

2.該方法返回的List是長度是固定的(fixed),不是只讀的。所以我們不能進行刪除、添加操作,而可以使用set()方法進行修改元素操作。如果你對返回的List執行add()添加新元素,會返回UnsupportedOperationException。至於為什么報這個異常,文章末尾我會給出解釋。

3.因為該方法返回的是基於原數組的List視圖,所以,當我們使用set方法修改了List中的元素的時候,那么原來的數組也會跟着改變(這是視圖的特性)。

4.從java 5開始,該方法支持泛型,所以我們可以從數組中得到類型安全ArrayList。

注意:
1.如果我們想讓轉換為只讀的List,可以使用Collections.unmodifiableList()方法來將數組轉換為指定List。

2.如果想返回的方法能夠進行添加、刪除元素操作,則可以使用new ArrayList(Arrays.asList(array)) ,這樣就會創建一個對象類型的ArrayList,並將數組的內容拷貝過去。

 

 

方法二:使用Collections.addAll()方法

 

該方法沒有第一種方法高效,但是更加靈活。同樣也是新建一個ArrayList,將數組的內容復制進去。

對於該方法需要了解的:
1. 沒有Arrays.asList()快,但是更加靈活。
2.該方法實際上是將數組的內容復制到ArrayList中
3.因為是復制內容到ArrayList中,所以我們對ArrayList進行修改、添加、刪除操作都不會影響原來的數組。
4.該方法相當於一個添加操作。該方法並不會覆蓋ArrayList中已經存在的元素。如下:

 

 

方法三:使用集合的addAll()方法

 

 

方法四:使用Spring框架將數組轉換為List

 

Spring框架中的CollectionUtils提供了幾個方法來將數組轉換為Arraylist。例如:CollectionUtils.arrayToList()。當然,返回的List是不可修改的,不能add()或remove()元素。

 

============================
java中將ArrayList轉換為數組的方法

使用toArray()方法:

 

 

==================
附加內容:

A.為何對Arrays.asList()返回的List進行添加、刪除操作會報錯,而set方法卻可以使用?

我們來看下Arrays.asList()方法相關源代碼,省略其余的代碼:

 

解釋:

我們注意到Arrays.asList()方法返回的是個內部的ArrayList,這個類同樣是AbstractList的一種實現,AbstractList的add和remove方法會有異常拋出:

 

,而該ArrayList就只有以下方法,並沒有實現add和remove方法:
contain(Object)
get(int)
indexOf(Object)
set(int)
size()
toArray()
toArray(T[])

根本就沒有add()和remove()方法,所以 當我們對返回的List執行add和remove方法時,就會報UnsupportedOperationException了。但是因為有set()方法,所以,我們可以修改返回的List。

B.我們說Arrays.asList()返回的是基於原數組的List視圖, 而且修改List的元素時候,原數組的內容也會同時改變,這又是為何呢?

解釋:根據上面的代碼,我們可以知道, 我們調用返回的ArrayList的set(),get(), indexOf(), contain(),size()這些方法,本質上都是去對原數組進行對應的操作。所以,我們改變返回的ArrayList中的內容的時候,原數組也會同時改變。這就是集合視圖(collection view),集合了常用的方法。

C.為何返回的ArrayList的長度是固定的?還有為什么Arrays.asList()方法最快?

解釋:還是上面的代碼,一般來說,ArrayList內部有一個對象類型數組作為實例變量來存放ArrayList中的數據。而上面的內部類中,ArrayList的這個實例變量就是a,而它只是將引用指向了原數組,並未將原數組的內容復制到a中。這樣就沒有進行復制操作,也沒有創建新的數組對象,自然最快了。

同時,該內部類ArrayList並為提供add方法等方法,自然是無法修改ArrayList的長度。而且因為是直接將實例變量a指向原數組,我們知道數組一旦初始化后就沒法修改它的大小了,所以原數組不能改變大小,自然返回的ArrayList的長度也不能改變長度,長度就只能是固定的。

參考:《3 Exampls to Convert an Array to ArrayList in Java》
http://javarevisited.blogspot.sg/2011/06/converting-array-to-arraylist-in-java.html

感謝:

N3verL4nd 的建議,增加UnsupportedOperationException來源進一步說明

轉載請注明:大步's Blog » 將java中數組轉換為ArrayList的方法實例(包括ArrayList轉數組)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM