Arrays.asList vs nuovo ArrayList (Arrays.asList ())

1. Panoramica

In questo breve tutorial daremo uno sguardo alle differenze tra Arrays.asList (array) e ArrayList (Arrays.asList (array)).

2. Arrays.asList

Cominciamo con il metodo Arrays.asList .

Utilizzando questo metodo, possiamo convertire da un array a un oggetto List di dimensioni fisse . Questo elenco è solo un wrapper che rende l'array disponibile come elenco. Nessun dato viene copiato o creato .

Inoltre, non possiamo modificarne la lunghezza perché non è consentito aggiungere o rimuovere elementi .

Tuttavia, possiamo modificare singoli elementi all'interno dell'array. Nota che tutte le modifiche che apportiamo ai singoli elementi della Lista si rifletteranno nel nostro array originale :

String[] stringArray = new String[] { "A", "B", "C", "D" }; List stringList = Arrays.asList(stringArray); 

Ora vediamo cosa succede se modifichiamo il primo elemento di stringList :

stringList.set(0, "E"); assertThat(stringList).containsExactly("E", "B", "C", "D"); assertThat(stringArray).containsExactly("E", "B", "C", "D");

Come possiamo vedere, anche il nostro array originale è stato modificato. Sia l'elenco che l'array ora contengono esattamente gli stessi elementi nello stesso ordine.

Proviamo ora a inserire un nuovo elemento in stringList :

stringList.add("F");
java.lang.UnsupportedOperationException at java.base/java.util.AbstractList.add(AbstractList.java:153) at java.base/java.util.AbstractList.add(AbstractList.java:111)

Come possiamo vedere, l' aggiunta / rimozione di elementi da / a List genererà java.lang.UnsupportedOperationException .

3. ArrayList (Arrays.asList (array))

Simile al metodo Arrays.asList , possiamo usare ArrayList (Arrays.asList (array)) quando dobbiamo creare un List da un array .

Ma, a differenza del nostro esempio precedente, questa è una copia indipendente dell'array, il che significa che la modifica del nuovo elenco non influirà sull'array originale . Inoltre, abbiamo tutte le funzionalità di un normale ArrayList, come l'aggiunta e la rimozione di elementi:

String[] stringArray = new String[] { "A", "B", "C", "D" }; List stringList = new ArrayList(Arrays.asList(stringArray)); 

Ora modifichiamo il primo elemento di stringList :

stringList.set(0, "E"); assertThat(stringList).containsExactly("E", "B", "C", "D");

E ora, vediamo cosa è successo con il nostro array originale:

assertThat(stringArray).containsExactly("A", "B", "C", "D");

Come possiamo vedere, il nostro array originale rimane intatto .

Prima di concludere, se diamo uno sguardo al codice sorgente JDK, possiamo vedere che il metodo Arrays.asList restituisce un tipo di ArrayList diverso da java.util.ArrayList . La differenza principale è che l' ArrayList restituito avvolge solo un array esistente, non implementa i metodi di aggiunta e rimozione .

4. Conclusione

In questo breve articolo, abbiamo esaminato le differenze tra due modi per convertire un array in un ArrayList . Abbiamo visto come si comportano queste due opzioni e la differenza tra il modo in cui implementano i loro array interni.

Come sempre, gli esempi di codice possono essere trovati su GitHub.