Deep Copy ArrayList in Java
Wenn wir in der Java-Sprache eine ArrayList kopieren möchten, gibt es zwei Möglichkeiten, dies zu tun. Machen Sie entweder eine tiefe oder eine flache Kopie.
In der tiefen Kopie wird ein vollständig neues Objekt erstellt, und daher spiegelt die Änderung des Status des alten Objekts keine Änderung in der neu erstellten Instanz wider.
In der flachen Kopie erstellen wir ein neues Objekt, das Verweise auf das vorhandene Objekt enthält. Daher ändert sich jede Änderung des Status des alten Objekts in der neu erstellten Instanz.
Das Diagramm, das die beiden oben genannten Definitionen besser veranschaulicht:
Was ist Deep Copy?
Das Erstellen eines neuen Objekts aus einem vorhandenen Objekt wird als Deep-Copy bezeichnet. Diese Art der Kopie enthält keine Verweise auf das vorliegende Objekt. Eine Deep-Copy ist eine iterative Aufgabe. Es kopiert rekursiv die internen Mitgliedsvariablen und Objekte in die neue Instanz.
Diese Art von Klon kopiert alle verschachtelten Objekte und hinterlässt keine Referenzverknüpfungen zwischen der Quelle und der Kopie. Dieses Klonen kopiert alle primitiven (Byte, Short, Int) und nicht-primitiven (String, Array, Class) Datentypen genau.
Wenn Sie ein Objekt tief kopieren möchten, überschreiben Sie die Methode clone()
der Schnittstelle Cloneable
aus der Klasse Object
.
Hier ist das Codebeispiel für das tiefe Kopieren einer ArrayList in Java:
package deepVsShallowCopy;
public class Car implements Cloneable {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Car(String name) {
this.name = name;
}
@Override
public Car clone() throws CloneNotSupportedException {
Car newCar = (Car) super.clone();
newCar.setName(newCar.getName());
return newCar;
}
}
In der obigen POJO-Klasse sollte man die Methode clone
zusammen mit getters
und setters
überschreiben. Die Methode clone()
löst CloneNotSupportedException
aus, die wir in die überschriebene Methode einfügen sollen.
Wir sollten unsere Version implementieren, um einen Klon des vorhandenen Objekts zu erstellen. Wir müssen alle Mitgliedsvariablen der Car-Klasse in eine neue Instanz kopieren.
Unten finden Sie die Implementierung der Treiberklasse für das Deep Copy einer ArrayList:
package deepVsShallowCopy;
import java.util.ArrayList;
import java.util.List;
public class DeepCopyArrayList {
public static void main(String[] args) throws CloneNotSupportedException {
// instantiate car instance
Car oldCar = new Car("Ambassador");
// instantiate an arraylist
List<Car> oldList = new ArrayList<Car>();
// add oldCar object into the list
oldList.add(oldCar);
// instantiate newList
List<Car> newList = new ArrayList<Car>();
// add object created using clone() into list
newList.add(oldList.get(0).clone());
// rename field in newList car element
newList.get(0).setName("Rolls Royce");
System.out.println("oldName : " + oldList.get(0).getName()); // oldName : Ambassador
System.out.println("newName : " + newList.get(0).getName()); // newName : Rolls Royce
}
}
In der obigen Implementierung wird die überschriebene Methode clone()
der Klasse Car
aufgerufen, die eine völlig neue Instanz zurückgibt. Und diese neu erstellte Instanz soll der ArrayList hinzugefügt werden.
Wenn wir das neu erstellte Objekt manipulieren, wirkt sich dies nicht auf die alte Objektreferenz aus.
Wenn wir in einer ArrayList einzeln iterieren möchten, muss die Methode clone()
über das Objekt von Car aufgerufen werden.
for (Car c : oldList) {
newList.add(c.clone());
}
Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.
LinkedIn