UnsupportedOperationException quando si tenta di rimuovere dall’elenco restituito da Array.asList

Sto usando un List per conservare alcuni dati ottenuti chiamando il metodo Array.asList() . Quindi sto cercando di rimuovere un elemento usando il myList.Remove(int i) . Ma mentre provo a farlo ottengo un UnsupportedOperationException . Quale sarebbe la ragione di questo? Come dovrei risolvere questo problema?

Array.asList() wrapping di una matrice nell’interfaccia dell’elenco. 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 lo rendono chiaro come potrebbero, ma dicono:

Restituisce un elenco di dimensioni fisse supportato dall’array specificato.

Il bit “fixed-size” dovrebbe essere un suggerimento che non è ansible 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 suggerirei di procurarmi la Biblioteca di Google Collections (o Guava , quando viene rilasciato). Puoi quindi utilizzare:

 List list = Lists.newArrayList(array); 

Il motivo per cui sto suggerendo questo è che la GCL è una cosa generalmente buona, e vale la pena usarla.

Come notato nei commenti, questo prende una copia dell’array; l’elenco non è supportato dall’array originale e le modifiche in entrambe le raccolte non verranno visualizzate nell’altro.

Non è java.util.ArrayList . Arrays.asList() restituisce la propria implementazione List (con le modifiche “scritte attraverso” nell’array).

È un elenco di dimensioni fisse, quindi non supporta la rimozione.

Puoi creare una vera ArrayList da essa:

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

È molto confuso come funziona asList() , devo ammettere.

Si prega di leggere i documenti API per Arrays.asList () :

Restituisce un elenco di dimensioni fisse supportato dall’array specificato. (Le modifiche all’elenco restituito “write through” all’array.)

Nota che Collections.remove (int) è contrassegnato in Javadocs come “operazione opzionale”, il che significa che non tutte le raccolte lo supporteranno. “Elenco di dimensioni fisse” significa che non è ansible modificare la dimensione della lista, che remove () farebbe. Quindi non è supportato.

Se si desidera modificare l’elenco generato da Arrays.asList (), basta copiarlo, ad es. new ArrayList(Arrays.asList(...)) .

l’implementazione che ricevi da asList non implementa un’interfaccia List completa. Trasformsrei 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

Perché ottieni l’elenco di sola lettura. provare

 List newList = new ArrayList(myList); 

uso

ArrayList anziché List

L’elenco ha un elemento dimensione fisso, l’elenco non può né aggiungere elementi né rimuovere elementi