Perché Arrays.asList () restituisce la propria implementazione ArrayList

Recentemente ho scoperto che ci sono in realtà 2 diverse implementazioni di ArrayList in Java (meglio tardi che mai immagino …).

Quindi mi chiedevo perché Arrays.asList(T... a) bisogno di restituire una lista che non può essere ridimensionata? Se avevano bisogno di un elenco non modificabile perché aggiungere il metodo set(int index, E element) allora?

Quindi la mia domanda generale è perché non restituire java.util.ArrayList dal Arrays.asList(T... a) ?

Inoltre cosa guadagni con l’implementazione java.util.Arrays.ArrayList ?

Hai chiesto:

Inoltre cosa guadagni con l’implementazione java.util.Arrays.ArrayList?

Questo perché Array $ ArrayList restituito da Arrays.asList è solo una vista dell’array originale. Quindi, quando viene modificato l’array originale, viene modificata anche la vista.

Se si usasse un ArrayList reale, gli elementi verranno copiati e una modifica sull’array originale non influenzerebbe l’ArrayList.

Le ragioni per farlo sono abbastanza semplici:

  • performance: non c’è bisogno di copiare nulla
  • efficienza della memoria: non è necessario un secondo array

asList dice che asList restituisce “una lista di dimensioni fisse supportata dall’array specificato”. Se si desidera ridimensionare l’array, è necessario crearne uno nuovo e copiare i vecchi dati. L’elenco non verrà supportato dalla stessa istanza dell’array. L’objective dichiarato è “Questo metodo funge da ponte tra API basate su array e raccolta”. e così scrivere nell’array sottostante è un requisito di progettazione.

Arrays.asList deve restituire un elenco che non può essere ridimensionato, poiché l’array sottostante non può essere ridimensionato, ma è modificabile, poiché l’assegnazione agli elementi dell’array sottostante è consentita.

Sono due classi diverse con comportamenti diversi.

L’elenco restituito quando hai chiamato Arrays.asList è un involucro sottile sull’array, non una copia. L’elenco restituito è di dimensioni fisse: il tentativo di chiamare add genererà un’eccezione UnsupportedOperationException .

java.util.ArrayList conserva invece la propria copia interna dei dati ed è di dimensioni variabili.

in realtà sei in grado di aggiungere elementi a ArrayList con l’aggiunta. metodo come questo:

 List l2= new ArrayList(Arrays.asList(array1)); l2.add("blueCheese"); 

Secondo me lo usi per ottenere le caratteristiche di una lista ma applicandole a una matrice.

Due commenti:

1, il tentativo di ridurre l’array restituito chiamando il metodo remove () dell’interfaccia List genererà una UnsupportedOperationException. Questo perché la class ArrayList interna all’interno della class Array estende AbstractList e il metodo remove () in AbstractList genera UnsupportedException.

Pertanto, una volta restituito l’elenco, è ansible sovrascrivere gli elementi esistenti EITHER nell’array OR nell’elenco restituito, MA NON si è autorizzati a far crescere l’array o a restringere l’array.

  1. In risposta a:

in realtà sei in grado di aggiungere elementi a ArrayList con l’aggiunta. metodo come questo: List l2 = new ArrayList (Arrays.asList (array1)); l2.add ( “Bluecheese”); La l2 è una copia indipendente della lista, quindi l’Elenco l2 è ora disaccoppiato dall’array e dall’elenco originali. Quindi blueCheese in in l2, ma non nella matrice / lista originale che sono state copiate l’una dall’altra.

-dbednar