Mam pewne struktury danych i chciałbym użyć jednej jako tymczasowej, a innej jako nie tymczasowej.
ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();
//fill myTempObject here
....
//make myObject contain the same values as myTempObject
myObject = myTempObject;
//free up memory by clearing myTempObject
myTempObject.clear();
teraz problem z tym oczywiście polega na tym, myObject
że tak naprawdę tylko wskazuje myTempObject
, więc raz myTempObject
zostanie wyczyszczony, tak jest myObject
.
Jak mogę zachować wartości od myTempObject
w myObject
użyciu Java?
List.addAll
. Ale jeśli chcesz zachować wszystkie obiekty, wyczyszczenie listy tymczasowej nie spowoduje wyczyszczenia całej pamięci. Ponieważ próbujesz tylko wyczyścić odniesienia, jeśli chodzi o obiekty, które próbujesz je zachować.Odpowiedzi:
Możesz użyć takiej sztuczki:
myObject = new ArrayList<Object>(myTempObject);
albo użyj
Możesz uzyskać więcej informacji o metodzie clone () tutaj
Pamiętaj jednak, że wszystkie te sposoby dają kopię Twojej Listy , a nie wszystkie jej elementy. Więc jeśli zmienisz jeden z elementów na skopiowanej liście, zostanie on również zmieniony na oryginalnej liście.
źródło
Object
niej pochodzi , zawsze zostanie przypisane przez odniesienie. Nawiasem mówiąc,clone()
jest to płytka kopia i nie skopiuje zawartych w niej,Objects
ale raczej odniesienia do nich. Jeśli chcesz zrobić głęboką kopię, zajrzyj na: stackoverflow.com/questions/64036/…oldList = newList
?originalArrayList. addAll (copyArrayList);
Uwaga : w przypadku używania metody addAll () do kopiowania zawartość obu list tablic (originalArrayList i copyArrayList) odwołuje się do tych samych obiektów lub zawartości. Więc jeśli zmodyfikujesz którykolwiek z nich, drugi również będzie odzwierciedlał tę samą zmianę.
Jeśli tego nie chcesz, musisz skopiować każdy element z originalArrayList do copyArrayList, tak jak przy użyciu pętli for lub while.
źródło
Nie ma żadnych ukrytych kopii tworzonych w Javie za pośrednictwem operatora przypisania. Zmienne zawierają wartość odniesienia (wskaźnik), a kiedy używasz
=
, ograniczasz tylko tę wartość.Aby zachować swoją zawartość
myTempObject
, musisz zrobić jej kopię.Można to zrobić, tworząc nowy
ArrayList
konstruktor za pomocą innegoArrayList
:ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);
Edycja: Jak Bohemian wskazuje w komentarzach poniżej, czy o to pytasz? Wykonując powyższe, oba
ArrayList
s (myTempObject
imyObject
) będą zawierały odniesienia do tych samych obiektów. Jeśli faktycznie potrzebujesz nowej listy zawierającej nowe kopie obiektów zawartych wmyTempObject
, musisz wykonać kopię każdego pojedynczego obiektu w oryginaleArrayList
źródło
clear()
naArrayList
myTempObject
nie miałoby żadnego wpływu na obiekty zawarte Therin. Jeśli chciał nowych kopii obiektów znajdujących się na liście, to inna historia, ale nie to zinterpretowałem jako pytanie.Przeszedłem przez to, mając ten sam problem.
Powiedzenie arraylist1 = arraylist2 ustawia je tak, aby wskazywały to samo miejsce, więc jeśli zmienisz dane, zmieni się i obie listy zawsze pozostaną takie same.
Aby skopiować wartości do niezależnej listy, właśnie użyłem foreach do skopiowania zawartości:
ArrayList list1 = new ArrayList(); ArrayList list2 = new ArrayList();
wypełnij listę1 w taki sposób, w jaki obecnie jesteś.
źródło
Załóżmy, że chcesz skopiować oldList do nowego obiektu ArrayList o nazwie newList
ArrayList<Object> newList = new ArrayList<>() ; for (int i = 0 ; i<oldList.size();i++){ newList.add(oldList.get(i)) ; }
Te dwie listy są niezależne, zmiany jednej nie są odzwierciedlane w drugiej.
źródło
Spróbujmy na przykładzie
ArrayList<String> firstArrayList = new ArrayList<>(); firstArrayList.add("One"); firstArrayList.add("Two"); firstArrayList.add("Three"); firstArrayList.add("Four"); firstArrayList.add("Five"); firstArrayList.add("Six"); //copy array list content into another array list ArrayList<String> secondArrayList=new ArrayList<>(); secondArrayList.addAll(firstArrayList); //print all the content of array list Iterator itr = secondArrayList.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); }
W druku wyjścia jak poniżej
Jeden,
dwa,
trzy,
cztery,
pięć,
sześć
Możemy również to zrobić używając metody clone () , dla której tworzy się dokładną kopię
za tę próbę możesz spróbować
**ArrayList<String>secondArrayList = (ArrayList<String>) firstArrayList.clone();** And then print by using iterator **Iterator itr = secondArrayList.iterator(); while (itr.hasNext()) { System.out.println(itr.next()); }**
źródło
Potrzebujesz do
clone()
indywidualnego obiektu.Constructor
a inne metody wykonują płytką kopię. Możesz wypróbować metodę Collections.copy .źródło
Collections.copy
jest zepsuta. Po pierwsze, mylące jest twierdzenie, że kopiuje elementy, podczas gdy odwołuje się do nich tylko na nowej liście. Po drugie, musisz już mieć listę miejsc docelowych o rozmiarze nie mniejszym niż lista źródłowa ...Prostym sposobem na dokładne skopiowanie oryginalnej listy jest dodanie wszystkich elementów z jednej listy do drugiej.
ArrayList<Object> originalList = new ArrayList<Object>(); ArrayList<Object> duplicateList = new ArrayList<Object>(); for(Object o : originalList) { duplicateList.add(o); }
Teraz jeśli wprowadzisz jakiekolwiek zmiany w originalList, nie wpłynie to na duplicateList.
źródło
aby skopiować jedną listę do drugiej listy, u możesz użyć metody o nazwie Collection.copy (myObject myTempObject). teraz po wykonaniu tych linii kodu u możesz zobaczyć wszystkie wartości listy w myObject.
źródło
ArrayList<List1> list1= new ArrayList<>(); ArrayList<List1> list2= new ArrayList<>(); //this will your copy your list1 into list2 list2.addAll(list1);
źródło
Oto obejście umożliwiające skopiowanie wszystkich obiektów z jednej arrayList do drugiej:
ArrayList<Object> myObject = new ArrayList<Object>(); ArrayList<Object> myTempObject = new ArrayList<Object>(); myObject.addAll(myTempObject.subList(0, myTempObject.size()));
subList ma na celu zwrócenie listy z zakresem danych. więc możesz skopiować całą tablicę arrayList lub jej część.
źródło
Załóżmy, że masz dwie listy arraylisty typu String. Lubić
ArrayList<String> firstArrayList ;//This array list is not having any data. ArrayList<String> secondArrayList = new ArrayList<>();//Having some data.
Teraz musimy skopiować dane drugiej tablicy do pierwszej tablicy w ten sposób,
firstArrayList = new ArrayList<>(secondArrayList );
Gotowe!!
źródło