2009-10-26 47 views

回答

53

Array.asList()包裹列表界面的數組。該列表仍然由數組支持。數組的大小是固定的 - 它們不支持添加或刪除元素,所以包裝器也不支持。

的文檔不使這個明確的,因爲他們可能會,但他們說:

返回由指定數組支持的固定大小的列表。

的「固定大小」位應該是你不能添加或刪除元素:)

暗示雖然有解決這個其他方式(其他的方法來從一個數組創建一個新的ArrayList )沒有額外的庫,我個人建議抓住Google Collections Library(或Guava,當它被釋放)。然後,您可以使用:

List<Integer> list = Lists.newArrayList(array); 

我建議這樣做的原因是,保利協鑫是一個普遍好東西,值得使用。

正如評論中指出的,這需要拷貝的數組;該列表不支持原始數組,並且兩個集合中的更改都不會在另一箇中看到。

+1

+1谷歌Guava – Snekse

+0

同意。不過,我認爲值得注意的是,原始方法確實會返回一個由原始數組支持的列表,並將「直寫」更改爲原始數組。使用它將不會返回原始數組支持的List,並且此返回的List中的任何更改都不會影響原始數組。 – desau

+0

@desau:我已編輯以表明這一點。 –

5

您從asList收到的實現不會實現完整的List接口。我會將列表轉換爲ArrayList,然後對其進行修改。

http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html#remove%28int%29

+0

你的意思是遍歷這個列表,並把所有的對象一個ArrayList在開始? –

+0

不,ArrayList構造函數將Collection作爲參數,因此您可以調用新的ArrayList。 –

17

這不是java.util.ArrayListArrays.asList()返回自己的List實現,並且不支持刪除。你可以創建一個真正的ArrayList

new java.util.ArrayList(Arrays.asList(someArray)); 

這是非常令人困惑如何asList()的作品,我必須承認。

0

因爲你得到只讀列表。 嘗試

List newList = new ArrayList(myList); 
+4

它不是隻讀的 - 它只是固定大小。 –

6

請閱讀API文檔Arrays.asList()

返回由指定數組支持的固定大小的列表。 (更改返回列表 「寫」到數組。)

注意Collections.remove(INT)被標記JavaDoc中爲「可選操作」,這意味着並不是所有的類別將支持它。 「固定大小列表」意味着您不能更改列表的大小,remove()會執行此操作。所以它不被支持。

如果您想更改Arrays.asList()生成的列表,只需複製它即可。 new ArrayList(Arrays.asList(...))

0

使用

的ArrayList不是List

名單已經固定大小元素,列表既不能加項,也不刪除項目

相關問題