List.copyOf
➙ nicht änderbare Liste
Du hast gefragt:
Gibt es keine andere Möglichkeit, eine Kopie einer Liste zuzuweisen?
Java 9 brachte die List.of
Methoden zur Verwendung von Literalen, um eine nicht modifizierbare List
unbekannte konkrete Klasse zu erstellen .
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of(
today.minusDays( 1 ) , // Yesterday
today , // Today
today.plusDays( 1 ) // Tomorrow
);
Zusammen mit dem haben wir auch List.copyOf
. Auch diese Methode gibt eine nicht modifizierbare List
unbekannte konkrete Klasse zurück.
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`.
Mit "nicht modifizierbar" meinen wir die Anzahl der Elemente in der Liste, und der Objektreferenz, der in jedem Slot als Element gespeichert ist, ist fest. Sie können keine Elemente hinzufügen, löschen oder ersetzen. Der in jedem Element enthaltene Objektbezug kann jedoch veränderlich sein oder nicht .
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
Sehen Sie diesen Code live auf IdeOne.com .
date.toString (): [2020-02-02, 2020-02-03, 2020-02-04]
colours.toString (): [AliceBlue, PapayaWhip, DarkSlateGray]
masterColors.toString (): [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
Sie haben nach Objektreferenzen gefragt. Wie bereits erwähnt, haben Sie nur eine Liste, wenn Sie eine Liste erstellen und zwei Referenzvariablen (Zeigern) zuweisen. Beide zeigen auf dieselbe Liste. Wenn Sie einen der beiden Zeiger zum Ändern der Liste verwenden, werden die Änderungen später in beiden Zeigern angezeigt, da sich nur eine Liste im Speicher befindet.
Sie müssen also eine Kopie der Liste erstellen. Wenn Sie möchten, dass diese Kopie nicht geändert werden kann, verwenden Sie die List.copyOf
in dieser Antwort beschriebene Methode. Bei diesem Ansatz erhalten Sie zwei separate Listen mit Elementen, die einen Verweis auf dieselben Inhaltsobjekte enthalten. In unserem obigen Beispiel, in dem String
Objekte zur Darstellung von Farben verwendet werden, schweben die Farbobjekte beispielsweise irgendwo im Speicher herum. Die beiden Listen enthalten Zeiger auf dieselben Farbobjekte. Hier ist ein Diagramm.
Die erste Liste kann colors
geändert werden. Dies bedeutet, dass einige Elemente entfernt werden können, wie im obigen Code gezeigt, wo wir das ursprüngliche 3. Element entfernt haben Chartreuse
(Index von 2 = Ordnungszahl 3). Und Elemente können hinzugefügt werden. Und die Elemente können geändert werden, um auf andere String
wie OliveDrab
oder zu verweisen CornflowerBlue
.
Im Gegensatz dazu sind die vier Elemente von masterColors
festgelegt. Kein Entfernen, kein Hinzufügen und kein Ersetzen einer anderen Farbe. Diese List
Implementierung ist nicht veränderbar.