Mam ArrayList
l1
rozmiar 10. Przypisuję l1
nowy typ odwołania do listy l2
. Will l1
i l2
punkt do samego ArrayList
obiektu? A może kopia ArrayList
obiektu jest przypisana l2
?
Gdy korzystam z l2
odwołania, jeśli zaktualizuję obiekt listy, odzwierciedla również zmiany w l1
typie odwołania.
Na przykład:
List<Integer> l1 = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
l1.add(i);
}
List l2 = l1;
l2.clear();
Czy nie ma innego sposobu przypisania kopii obiektu listy do nowej zmiennej referencyjnej, oprócz utworzenia 2 obiektów listy i wykonania kopii na kolekcjach od starych do nowych?
List.subList
aby uzyskać „widok” na sekcję oryginalnej listy.(ArrayList<ArrayList<Object>>)
? czy rekurencyjnie utworzy to kopie wszystkich potomnych obiektów ArrayList?Spróbuj użyć
Collections.copy(destination, source);
źródło
new ArrayList<>(source);
?Collections.copy
wcale nie jest alternatywą dlanew ArrayList<>(source)
. WCollections.copy
rzeczywistości zakłada się, żedestination.size()
jest on co najmniej tak duży jaksource.size()
, a następnie kopiuje zakres indeks po indeksie za pomocąset(int,E)
metody. Metoda nie dodaje nowych elementów do miejsca docelowego. Odwołaj się do kodu źródłowego, jeśli nie jest wystarczająco jasny z Javadoc.Tak
l1
il2
wskaże to samo odwołanie, ten sam obiekt.Jeśli chcesz utworzyć nową ArrayList na podstawie innej ArrayList, wykonaj następujące czynności:
Wynik będzie
l1
nadal miał 2 elementy il2
będzie miał 3 elementy.źródło
List<String> l2 = new ArrayList<String>(l1)
iList<String> l2 = l1
?Innym wygodnym sposobem kopiowania wartości z src ArrayList do dest Arraylist jest:
Jest to faktyczne kopiowanie wartości, a nie tylko kopiowanie referencji.
źródło
Istnieje metoda addAll (), która posłuży do skopiowania jednej tablicy ArrayList do drugiej.
Na przykład masz dwie listy tablic : sourceList i targetList , użyj poniższego kodu.
targetList.addAll (sourceList);
źródło
Java nie przekazuje obiektów, przekazuje odniesienia (wskaźniki) do obiektów. Tak więc, l2 i l1 są dwoma wskaźnikami do tego samego obiektu.
Musisz utworzyć wyraźną kopię, jeśli potrzebujesz dwóch różnych list o tej samej zawartości.
źródło
List.copyOf
➙ lista niemodyfikowalnaZapytałeś:
Java 9 przyniosła
List.of
metody użycia literałów do stworzenia niemodyfikowalnejList
nieznanej konkretnej klasy.Oprócz tego mamy również
List.copyOf
. Ta metoda również zwraca niemodyfikowalnąList
nieznaną konkretną klasę.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 .
Zobacz ten kod uruchamiany na żywo w IdeOne.com .
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órymString
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 elementChartreuse
(indeks 2 = porządek 3). I elementy mogą być dodawane. I elementy można zmienić, aby wskazywały na inne,String
takie jakOliveDrab
lubCornflowerBlue
.Natomiast cztery elementy
masterColors
są ustalone. Bez usuwania, bez dodawania i bez zastępowania innego koloru. ToList
wdrożenie jest niemodyfikowalne.źródło