Heim  >  Artikel  >  Java  >  Der Unterschied und die Implementierung von „Shallow Copy“ und „Deep Copy“ in Java (mit Code)

Der Unterschied und die Implementierung von „Shallow Copy“ und „Deep Copy“ in Java (mit Code)

angryTom
angryTomnach vorne
2019-11-26 15:53:101970Durchsuche

Der Unterschied und die Implementierung von „Shallow Copy“ und „Deep Copy“ in Java (mit Code)

Es gibt drei Möglichkeiten, die Referenz eines Objekts auf ein anderes Objekt zu kopieren. Die erste Methode ist die direkte Zuweisung, die zweite Methode ist die flache Kopie und die dritte Methode ist die tiefe Kopie.

1. Direkte Zuweisung

In Java ist A a1 = a2, dies kopiert tatsächlich die Referenz, das heißt, a1 und a2 zeigen auf das gleiche Objekt. Wenn sich also a1 ändert, ändern sich auch die Mitgliedsvariablen in a2.

2. Flache Kopie (kopieren Sie die Referenz, aber nicht das referenzierte Objekt)

Flache Kopie, auch flache Kopie genannt. Erstellen Sie ein neues Objekt und kopieren Sie dann die nicht statischen Felder des aktuellen Objekts in das neue Objekt. Wenn das Feld vom Typ „Wert“ ist, kopieren Sie das Feld, wenn es vom Typ „Referenz“ ist Objekt. Daher verweisen das Originalobjekt und seine Kopie auf dasselbe Objekt.

(Empfohlenes Video: Java-Video-Tutorial)

class Resume implements Cloneable{ 
     public Object clone() { 
         try { 
             return (Resume)super.clone(); 
         } catch (Exception e) { 
             e.printStackTrace(); 
         return null; 
         } 
     } 
}

3. Deep Copy (Kopieren des Objekts und seines Referenzobjekts)

Auch als Deep Copy bekannt, kopiert nicht nur das Objekt selbst, sondern auch alle Objekte, auf die durch die im Objekt enthaltenen Referenzen verwiesen wird.

class Student implements Cloneable {
         String name;
         int age;
         Professor p;
     Student(String name, int age, Professor p) {
         this.name = name;
         this.age = age;
         this.p = p;
     }
     public Object clone() {
         Student o = null;
         try {
             o = (Student) super.clone();
         } catch (CloneNotSupportedException e) {
             System.out.println(e.toString());
         }
     o.p = (Professor) p.clone();
     return o;
     }
}

Schritte zum Klonen eines Objekts mit der clone()-Methode:

1) Die geklonte Klasse muss die Cloneable-Schnittstelle implementieren.

2) Die geklonte Klasse muss die clone()-Methode überschreiben.

Wie wählt man also aus, welche Kopiermethode beim Programmieren verwendet werden soll? Zunächst wird die Klasse auf Datenelemente überprüft, die keine Basistypen sind (d. h. Objekte). Wenn nicht, geben Sie einfach super.clone() zurück. Wenn dies der Fall ist, stellen Sie sicher, dass alle in der Klasse enthaltenen Mitgliedsvariablen vom Nicht-Basistyp Deep Copying implementieren.

Erweiterung: Was ist der Unterschied zwischen Shallow Copy und Deep Copy?

Shallow Clone: ​​​​Alle Variablen des kopierten Objekts enthalten dieselben Werte wie das Originalobjekt, und die Referenzen aller anderen Objekte verweisen weiterhin auf das Originalobjekt. Mit anderen Worten: Eine flache Kopie kopiert nur das betreffende Objekt, nicht die Objekte, auf die sie verweist.

Deep Clone: ​​​​Alle Variablen des kopierten Objekts enthalten dieselben Werte wie das Originalobjekt, mit Ausnahme der Variablen, die auf andere Objekte verweisen. Variablen, die auf andere Objekte verweisen, verweisen auf das neue Objekt, das kopiert wird, nicht auf die ursprünglich referenzierten Objekte. Mit anderen Worten: Beim Deep Copy werden alle Objekte kopiert, auf die das kopierte Objekt verweist.

Erweiterung:

Der Prototypmodus wird hauptsächlich zum Kopieren von Objekten verwendet, implementiert die Schnittstelle (implementiert die klonbare Schnittstelle) und überschreibt eine Methode (überschreibt das Klonen im Objekt). class ()-Methode), dh der Prototypmodus ist abgeschlossen.

Das Kopieren im Prototypenmodus ist in „flache Kopie“ und „tiefe Kopie“ unterteilt:

Flache Kopie: Kopieren Sie den Wert der Mitgliedsvariablen des Werttyps. Mitgliedsvariablen von Referenztypen kopieren nur die Referenz, nicht das referenzierte Objekt.

Kopieren: Kopieren Sie den Wert von Mitgliedsvariablen vom Werttyp und kopieren Sie das Referenzobjekt von Mitgliedsvariablen vom Referenztyp.

(Die Klonmethode der Object-Klasse kopiert nur den Basisdatentypwert im Objekt. Arrays, Containerobjekte, Referenzobjekte usw. werden nicht kopiert. Dies ist eine flache Kopie. Wenn Sie möchten Um eine tiefe Kopie zu implementieren, müssen Sie Arrays, Containerobjekte, Referenzobjekte usw. im Prototypmodus separat kopieren)

Vorteile des Prototypmodus:

1 Wenn Das Erstellen eines neuen Objekts ist komplizierter. Sie können das Prototypmuster verwenden, um den Objekterstellungsprozess zu vereinfachen.

2. Im Hinblick auf die Leistung ist es immer besser, ein Objekt im Modus zu erstellen, als ein Objekt direkt neu zu erstellen, da es sich bei der Klonmethode der Object-Klasse um eine lokale Methode handelt, die den Binärstream direkt ausführt Der Speicher, insbesondere das Kopieren großer Objekte, ist der Leistungsunterschied sehr offensichtlich.

Verwendungsszenarien von Prototypmustern:

Aufgrund der oben genannten Vorteile können Sie die Verwendung von Prototypmustern in Betracht ziehen, wenn Sie wiederholt ähnliche Objekte erstellen müssen . Wenn Sie beispielsweise ein Objekt innerhalb einer Schleife erstellen müssen, der Objekterstellungsprozess komplex ist oder viele Schleifen vorhanden sind, kann die Verwendung des Prototypmusters nicht nur den Erstellungsprozess vereinfachen, sondern auch die Gesamtleistung des Systems erheblich verbessern.

Dieser Artikel stammt von der chinesischen PHP-Website, Spalte Java-Tutorial, willkommen zum Lernen!

Das obige ist der detaillierte Inhalt vonDer Unterschied und die Implementierung von „Shallow Copy“ und „Deep Copy“ in Java (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen