2012-11-14 155 views
1

我想知道使用Arrays.asList的優缺點。我在我的代碼中使用它時遇到了一個問題。使用Arrays.asList的優缺點

此外,我想知道一個數組轉換爲數組列表(集合)的最佳途徑,而無需使用Arrays.asList

+2

什麼是你facing.you必須嘗試添加一些elements..this問題是不可能的Arrays.asList.Its只是一個數組的列表包裝。 – Emil

+1

@Emil好點,在這種情況下'new ArrayList <>(Arrays.asList(array));'會做的伎倆。 – assylias

回答

5

在磁盤陣列轉換成一個ArrayList,我這樣做:

new ArrayList<T>(Arrays.asList(myArray)); 

您需要將您的列表包裝在新的ArrayList中,否則您將無法添加任何元素,因爲asList()返回的列表具有固定大小。所以你在嘗試添加元素時會得到UnsupportedOperationException。

但是你可能也想做到這一點,如果你不喜歡上面的方法:

Collections.addAll(arraylist, array); 

兩者都是同等性能的角度來看,作爲據我所知


但更重要的是,使用第一種方法的問題是什麼?

+0

我得到UnsupportedOperationException。情景是,我不希望數組重新填充。 – Pratik

+0

問題得到解決,解決方法得到了幫助。我使用了「for」循環來將數組中的元素添加到列表中。 – Pratik

1

Arrays.asList讓你看看一個數組,就好像它是一個List。這意味着未來對陣列的更改將影響列表,未來對列表的更改將影響陣列。無論這是一個好還是壞的事情取決於你打算如何處理這個List,以及你希望它如何與這個數組相關聯。

對於拋棄使用,我一定會去Arrays.asList。例如,List有一個顯示內容的toString,所以System.out.println(Arrays.asList(myArray))可能很有用。

如果您想保留數組的快照,而不受未來更改的影響,我仍然會使用Arrays.asList,但是從結果創建一個新的List,如前一個來自@NNzz的答案所示。

+0

好久不見!歡迎登機! –

1

我想知道使用Arrays.asList的優缺點。

主要「優點」是:

  • 它不涉及複製數據,
  • 您的列表將看到支持數組中所做的任何更改(如果希望)

主要的 「缺點」 是:

  • 您不能添加或刪除的Elemen通過「asList」包裝TS,
  • 您的列表將看到支持數組所做的任何更改(如果你不希望這樣做)

(也有一個明顯的限制:你不能申請asList到一系列基元。但是,轉換一系列基元是不平凡的......)


我想知道一個數組轉換爲數組列表(集合)的最佳途徑,而無需使用Arrays.asList

最簡單的方法把一個數組列表,而無需使用aslist是:

new ArrayList<T>(Arrays.asList(arrayOfT)) 

您可以用此得到表現稍好:

ArrayList<T> list = new ArrayList<T>(arrayOfT.length); 
Collections.addAll(list, arrayOfT); 

因爲ArrayList<T>(Collection<T>)構造函數首先調用toArray()來創建一個臨時數組(至少在Java 7中它是這樣做的)。這意味着有一個額外的副本在引擎蓋下進行。

但底線是,只是使用Arrays.asList比任何避免使用它更簡單和便宜

1

除了現有的答案,特別是@Stephen C的一個很好的答案,Arrays.asList還有一個問題。

有效的Java


Arrays.asList從未被設計來收集多個參數到一個列表,但它似乎好主意,改造它這樣做時,可變參數被添加到該平臺。因此,它成爲可能做這樣的事情:

List<String> homophones = Arrays.asList("to", ""too", "two"); 

這種用法的作品,但它是一個很大的錯誤來啓用它。

釋放1.5之前,這是一個常見的成語打印數組的內容:

// Obsolete idiom to print an array! 
System.out.println(Arrays.asList(myArray)); 

成語是必要的,因爲陣列繼承自Object toString實施,因此調用toString直接在陣列產生一個無用的字符串,如[Ljava.lang.Integer;@3e25a5。這個習語只適用於對象引用類型的數組,但是如果你不小心在一個基元數組上嘗試過它,程序將無法編譯。例如,此程序:

Va.java:6:在陣列asList(對象[])不能被施加到(INT

public static void main(String[] args) { 
    int[] digits = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 4 }; 
    System.out.println(Arrays.asList(digits)); 
} 

將在釋放1.4產生此錯誤消息[]) System.out.println(Arrays.asList(digits));

由於不幸的決定改造Arrays.asList作爲釋放1.5的可變參數的方法,該程序現在編譯沒有錯誤或警告。

在光明的一面,Arrays.asList用於將數組轉換爲字符串的習慣用法現在已經過時,而且當前的用法更加健壯。同樣在版本1中。5,Arrays類得到了全部補充Arrays.toString方法(不可變varargs方法!)專門設計爲任何類型的數組轉換爲字符串。如果你在的地方Arrays.asList使用Arrays.toString,該程序會產生預期的結果:

// The right way to print an array 
System.out.println(Arrays.toString(myArray));