List.copyOf
➙ elenco non modificabile
Hai chiesto:
Non esiste altro modo per assegnare una copia di un elenco
Java 9 ha portato i List.of
metodi per usare i letterali per creare una List
classe concreta non modificabile di sconosciuta.
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of(
today.minusDays( 1 ) , // Yesterday
today , // Today
today.plusDays( 1 ) // Tomorrow
);
Insieme a quello abbiamo anche ottenuto List.copyOf
. Anche questo metodo restituisce un non modificabile List
di classe concreta sconosciuta.
List< String > colors = new ArrayList<>( 4 ) ; // Creates a modifiable `List`.
colors.add ( "AliceBlue" ) ;
colors.add ( "PapayaWhip" ) ;
colors.add ( "Chartreuse" ) ;
colors.add ( "DarkSlateGray" ) ;
List< String > masterColors = List.copyOf( colors ) ; // Creates an unmodifiable `List`.
Per "non modificabile" intendiamo il numero di elementi nell'elenco e il riferimento all'oggetto contenuto in ogni slot come elemento è fisso. Non è possibile aggiungere, eliminare o sostituire elementi. Ma il referente oggetto contenuto in ciascun elemento può o meno essere mutabile .
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
Vedi questo codice eseguito dal vivo su IdeOne.com .
Date.toString (): [2020-02-02, 2020-02-03, 2020-02-04]
colors.toString (): [AliceBlue, PapayaWhip, DarkSlateGray]
masterColors.toString (): [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
Hai chiesto informazioni sui riferimenti agli oggetti. Come altri hanno detto, se crei un elenco e lo assegni a due variabili di riferimento (puntatori), hai ancora un solo elenco. Entrambi indicano lo stesso elenco. Se si utilizza uno dei due puntatori per modificare l'elenco, entrambi i puntatori vedranno in seguito le modifiche, poiché esiste un solo elenco in memoria.
Quindi devi fare una copia dell'elenco. Se vuoi che quella copia non sia modificabile, usa il List.copyOf
metodo come discusso in questa risposta. In questo approccio, si finisce con due elenchi separati, ciascuno con elementi che contengono un riferimento agli stessi oggetti contenuto. Ad esempio, nel nostro esempio sopra che utilizza String
oggetti per rappresentare i colori, gli oggetti colorati fluttuano nella memoria da qualche parte. I due elenchi contengono puntatori agli oggetti dello stesso colore. Ecco un diagramma.
Il primo elenco colors
è modificabile. Ciò significa che alcuni elementi potrebbero essere rimossi come visto nel codice sopra, dove abbiamo rimosso il 3 ° elemento originale Chartreuse
(indice di 2 = ordinale 3). E gli elementi possono essere aggiunti. E gli elementi possono essere cambiati per puntare ad altri String
come OliveDrab
oCornflowerBlue
.
Al contrario, i quattro elementi di masterColors
sono fissi. Nessuna rimozione, nessuna aggiunta e nessuna sostituzione di un altro colore. Tale List
implementazione è immodificabile.