List.copyOf
➙ lista niemodyfikowalna
Zapytałeś:
Czy nie ma innego sposobu przypisania kopii listy
Java 9 przyniosła List.of
metody użycia literałów do stworzenia niemodyfikowalnej List
nieznanej konkretnej klasy.
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of(
today.minusDays( 1 ) , // Yesterday
today , // Today
today.plusDays( 1 ) // Tomorrow
);
Oprócz tego mamy również List.copyOf
. Ta metoda również zwraca niemodyfikowalną List
nieznaną konkretną klasę.
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`.
Przez „niemodyfikowalny” rozumiemy liczbę elementów na liście, a odniesienie do obiektu utrzymywane w każdym gnieździe jako element jest stałe. Nie można dodawać, upuszczać ani zamieniać elementów. Ale odniesienie do obiektu utrzymywane w każdym elemencie może, ale nie musi, być zmienne .
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
Zobacz ten kod uruchamiany na żywo w IdeOne.com .
date.toString (): [2020-02-02, 2020-02-03, 2020-02-04]
colors.toString (): [AliceBlue, PapayaWhip, DarkSlateGray]
masterColors.toString (): [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
Zapytałeś o odwołania do obiektów. Jak powiedzieli inni, jeśli utworzysz jedną listę i przypiszesz ją do dwóch zmiennych odniesienia (wskaźników), nadal będziesz mieć tylko jedną listę. Oba wskazują na tę samą listę. Jeśli użyjesz dowolnego wskaźnika do zmodyfikowania listy, oba wskaźniki zobaczą później zmiany, ponieważ w pamięci jest tylko jedna lista.
Musisz więc zrobić kopię listy. Jeśli chcesz, aby ta kopia nie była modyfikowalna, użyj List.copyOf
metody opisanej w tej odpowiedzi. W tym podejściu powstają dwie osobne listy, każda z elementami zawierającymi odwołanie do tych samych obiektów treści. Na przykład w powyższym przykładzie, w którym String
obiekty reprezentują kolory, obiekty kolorowe pływają gdzieś w pamięci. Dwie listy zawierają wskaźniki do obiektów tego samego koloru. Oto schemat.
Pierwsza lista colors
jest modyfikowalna. Oznacza to, że niektóre elementy można usunąć, jak pokazano w powyższym kodzie, w którym usunęliśmy oryginalny trzeci element Chartreuse
(indeks 2 = porządek 3). I elementy mogą być dodawane. I elementy można zmienić, aby wskazywały na inne, String
takie jak OliveDrab
lubCornflowerBlue
.
Natomiast cztery elementy masterColors
są ustalone. Bez usuwania, bez dodawania i bez zastępowania innego koloru. To List
wdrożenie jest niemodyfikowalne.