Deep Copy ArrayList in Java

Rashmi Patidar 15 Februar 2024
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:

Tiefe gegen flache Kopie

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 Patidar avatar Rashmi Patidar avatar

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

Verwandter Artikel - Java ArrayList