2009-10-26 15 views

risposta

53

Array.asList()avvolge una matrice nell'interfaccia lista. L'elenco è ancora supportato dall'array. Le matrici sono di dimensioni fisse - non supportano l'aggiunta o la rimozione di elementi, quindi il wrapper non può neanche.

I documenti non fanno questo chiaro come potrebbero, ma fanno dicono:

Restituisce un elenco di dimensioni fisse sostenuto dalla matrice specificata.

La "dimensione fissa" bit dovrebbe essere un suggerimento che non è possibile aggiungere o rimuovere elementi :)

Anche se ci sono altri modi per aggirare questo (altri modi per creare un nuovo ArrayList da un array) senza librerie aggiuntive, personalmente consiglierei di prendere in considerazione lo Google Collections Library (o Guava, al momento del rilascio). È quindi possibile utilizzare:

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

Il motivo che sto suggerendo è che il GCL è una buona cosa in generale, e vale la pena utilizzare.

Come indicato nei commenti, questo prende uno copia della matrice; l'elenco non è supportato dall'array originale e le modifiche in entrambe le raccolte non verranno visualizzate nell'altro.

+1

+1 per Google Guava – Snekse

+0

concordato. Tuttavia, penso che valga la pena notare che il metodo originale restituisce un elenco supportato dall'array originale e modifica "write-through" all'array originale. L'utilizzo di questo non restituirà un elenco supportato dall'array originale e qualsiasi modifica in questo elenco restituito NON influirà sull'array originale. – desau

+0

@desau: ho modificato per indicarlo. –

5

l'implementazione ricevuta da asList non implementa un'interfaccia List completa. Trasformerei l'elenco in ArrayList e quindi apporterei le modifiche su di esso.

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

+0

Intendi l'iterazione di questa lista e mettere tutti gli oggetti da un ArrayList all'inizio? –

+0

no, il costruttore ArrayList accetta una raccolta come argomento, quindi è sufficiente chiamare il nuovo ArrayList. –

17

Non è java.util.ArrayList. Arrays.asList() restituisce la propria implementazione List e non supporta la rimozione. È possibile creare un vero e proprio ArrayList da esso:

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

E 'molto confusa come asList() lavori, devo ammettere.

0

Perché si ottiene l'elenco di sola lettura. provare

List newList = new ArrayList(myList); 
+4

Non è di sola lettura: è solo una dimensione fissa. –

6

Si prega di leggere la documentazione API per Arrays.asList():

Restituisce un elenco di dimensioni fisse sostenuto dalla matrice specificata. (Modifiche al lista restituita "scrivono attraverso" alla matrice.)

noti che Collections.remove (int) è segnato nella Javadocs come "un'operazione facoltativa", cioè non tutti Collezioni lo sosterrà. "Elenco di dimensioni fisse" significa che non è possibile modificare la dimensione della lista, che remove() farebbe. Quindi non è supportato.

Se si desidera modificare l'elenco generato da Arrays.asList(), è sufficiente copiarlo, ad es. new ArrayList(Arrays.asList(...)).

0

uso

ArrayList invece di Lista

Lista ha fissato elemento dimensione, Lista non può né voce aggiunta né rimuovere voce

Problemi correlati