So implementieren Sie Shallow Copy und Deep Copy in Java



Dieser Artikel vermittelt Ihnen anhand von Beispielen detaillierte und umfassende Kenntnisse über Shallow Copy und Deep Copy in Java.

Beim Klonen wird ein Replikat oder eine Kopie von erstellt Objekt, Klonmethode Java.lang.Object wird verwendet, um eine Kopie oder ein Replikat eines Objekts zu erstellen. Java-Objekte, die die klonbare Schnittstelle implementieren, können die Klonmethode verwenden. In diesem Artikel werden wir die flache Kopie und die tiefe Kopie in der folgenden Reihenfolge behandeln:

Kopie des Java-Objekts erstellen

Wir können eine Replik oder Kopie des Java-Objekts von erstellen





1. Erstellen einer Objektkopie an einem anderen Speicherort. Dies wird als Deep Copy bezeichnet.

2. Erstellen Sie eine neue Referenz, die auf denselben Speicherort verweist. Dies wird auch als flache Kopie bezeichnet.



Tutorial zu SQL Server Integration Services

Flache Kopie

Die Standardimplementierung der Klonmethode erstellt eine flache Kopie des Quellobjekts. Dies bedeutet, dass eine neue Instanz vom Typ Objekt erstellt wird, alle Felder in eine neue Instanz kopiert werden und ein neues Objekt vom Typ 'Objekt' zurückgegeben wird. Dieses Objekt muss explizit im Objekttyp des Quellobjekts typisiert werden.

Dieses Objekt enthält eine exakte Kopie aller Felder des Quellobjekts, einschließlich des primitiven Typs und der Objektreferenzen. Wenn das Quellobjekt Verweise auf andere Objekte im Feld enthält, enthält die neue Instanz nur Verweise auf diese Objekte. Eine Kopie dieser Objekte wird nicht erstellt. Das heißt, wenn wir Änderungen in der flachen Kopie vornehmen, werden Änderungen im Quellobjekt wiedergegeben. Beide Instanzen sind nicht unabhängig.

Die Klonmethode in der Object-Klasse ist von Natur aus geschützt, sodass nicht alle Klassen die clone () -Methode verwenden können. Sie müssen die klonbare Schnittstelle implementieren und die Klonmethode überschreiben. Wenn die klonbare Schnittstelle nicht implementiert ist, wird CloneNotSupportedException.super.clone () eine flache Kopie gemäß der Implementierung in der Object-Klasse zurückgeben.



Code für flache Kopie

Paket com.test Klasse Abteilung {String empId String grade String Bezeichnung öffentliche Abteilung (String empId, String grade, String Bezeichnung) {this.empId = empId this.grade = Grad this.designation = Bezeichnung}} Klasse Mitarbeiter implementiert Cloneable {int id Zeichenfolgenname Abteilungsabteilung öffentlicher Mitarbeiter (int id, Zeichenfolgenname, Abteilungsabteilung) {this.id = id this.name = name this.dept = Abteilung} // Standardversion der clone () -Methode. Es wird eine flache Kopie eines Objekts erstellt. protected Object clone () löst CloneNotSupportedException aus {return super.clone ()}} öffentliche Klasse ShallowCopyInJava {public static void main (String [] args) {Abteilung dept1 = neue Abteilung ('1', 'A', 'AVP') Mitarbeiter emp1 = neuer Mitarbeiter (111, 'John', Abteilung1) Mitarbeiter emp2 = null try {// Erstellen eines Klons von emp1 und Zuweisen zu emp2 emp2 = (Mitarbeiter) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Drucken der Bezeichnung von 'emp1' System.out.println (emp1.dept.designation) // Ausgabe: AVP // Ändern der Bezeichnung von 'emp2' emp2.dept.designation = 'Director' // Diese Änderung wird im ursprünglichen Mitarbeiter 'emp1' System.out.println (emp1.dept.designation) // Output: Director}} berücksichtigt

Ausgabe:

Output-Shallow-Copy

Was ist vorübergehend in Java

Im obigen Beispiel haben wir eine Employee-Klasse emp1 mit drei Klassenvariablen-IDs (int), Namen (String) und Abteilungen (Abteilung).

Wir haben jetzt emp1 in emp2 geklont, um eine flache Kopie zu erstellen. Danach haben wir die Bezeichnung mithilfe des emp2-Objekts geändert und überprüft, dass dieselben Änderungen auch in emp1 berücksichtigt wurden.


Tiefe Kopie

Die tiefe Kopie eines Objekts enthält eine exakte Kopie aller Felder des Quellobjekts wie eine flache Kopie. Wenn das Quellobjekt jedoch anders als eine flache Kopie auf das Objekt als Felder verweist, wird durch Aufrufen des Klons eine Replik des Objekts erstellt Methode. Dies bedeutet, dass sowohl Quell- als auch Zielobjekte unabhängig voneinander sind. Änderungen am geklonten Objekt wirken sich nicht auf das Quellobjekt aus.

Code für Deep Copy

Paket com.test Klasse Abteilung implementiert Klonbar {String empId String Klasse String Bezeichnung öffentliche Abteilung (String empId, String Grad, String Bezeichnung) {this.empId = empId this.grade = Grad this.designation = Bezeichnung} // Standardversion des Klons () Methode. protected Object clone () löst die Klasse CloneNotSupportedException {return super.clone ()}} aus. Employee implementiert Cloneable {int id String name Abteilungsabteilung public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Überschreiben der clone () -Methode, um eine tiefe Kopie eines Objekts zu erstellen. protected Object clone () löst CloneNotSupportedException aus {Employee emp = (Employee) super.clone () emp.dept = (Abteilung) dept.clone () return emp}} öffentliche Klasse DeepCopyInJava {public static void main (String [] args) { Abteilung dept1 = neue Abteilung ('1', 'A', 'AVP') Mitarbeiter emp1 = neuer Mitarbeiter (111, 'John', Abteilung1) Mitarbeiter emp2 = null try {// Klon von emp1 erstellen und emp2 zuweisen emp2 = (Mitarbeiter) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Drucken der Bezeichnung 'emp1' System.out.println (emp1.dept.designation) // Ausgabe: AVP / / Ändern der Bezeichnung von 'emp2' emp2.dept.designation = 'Director' // Diese Änderung wird im ursprünglichen Mitarbeiter 'emp1' System.out.println (emp1.dept.designation) // Ausgabe: AVP}} wiedergegeben

Ausgabe:

Im obigen Beispiel für eine tiefe Kopie sind im Gegensatz zur flachen Kopie sowohl das Quell- als auch das Zielobjekt unabhängig voneinander. Änderungen in emp2 wirken sich nicht auf emp1 aus.

Unterschied zwischen flacher und tiefer Kopie

Flache Kopie Tiefe Kopie
Geklontes Objekt und Quellobjekt sind nicht vollständig getrenntGeklonte Objekte und Quellobjekte sind völlig unabhängig voneinander.
In der geklonten Instanz vorgenommene Änderungen wirken sich auf die Referenzvariable des Quellobjekts ausIn der geklonten Instanz vorgenommene Änderungen wirken sich nicht auf die Referenzvariable des Quellobjekts aus.
Die Standardversion des Klons ist die flache KopieUm eine tiefe Kopie zu erstellen, müssen wir die Klonmethode der Object-Klasse überschreiben.
Eine flache Kopie wird bevorzugt, wenn Klassenvariablen des Objekts nur primitive Typen als Felder sindEine tiefe Kopie wird bevorzugt, wenn die Klassenvariablen des Objekts Verweise auf andere Objekte als Felder enthalten.
Es ist relativ schnellEs ist relativ langsam.

Damit kommen wir zum Ende des Artikels Shallow Copy und Deep Copy. Ich hoffe, Sie haben die verschiedenen Unterschiede zwischen den beiden verstanden.

wie man eine Warnung in Javascript macht

Besuche die von Edureka, einem vertrauenswürdigen Online-Lernunternehmen mit einem Netzwerk von mehr als 250.000 zufriedenen Lernenden auf der ganzen Welt. Der Java J2EE- und SOA-Schulungs- und Zertifizierungskurs von Edureka richtet sich an Studenten und Fachleute, die Java-Entwickler werden möchten.

Hast du eine Frage an uns? Bitte erwähnen Sie dies im Kommentarbereich dieses Blogs „Shallow Copy and Deep Copy“. Wir werden uns so schnell wie möglich bei Ihnen melden.