Hoe ondiepe kopie en diepe kopie in Java te implementeren



Dit artikel biedt u een gedetailleerde en uitgebreide kennis van Shallow Copy en Deep Copy in Java met voorbeelden.

Klonen is een proces waarbij een replica of kopie van object, kloonmethode Java.lang.Object wordt gebruikt om een ​​kopie of replica van een object te maken. java-objecten die de Cloneable-interface implementeren, komen in aanmerking voor het gebruik van de kloonmethode. In dit artikel bespreken we de Shallow Copy en Deep Copy in de volgende volgorde:

Een kopie van een Java-object maken

We kunnen een replica of kopie van het java-object maken door





1. Een kopie van een object op een andere geheugenlocatie maken. Dit wordt een diepe kopie genoemd.

2. Een nieuwe referentie maken die naar dezelfde geheugenlocatie verwijst. Dit wordt ook wel een ondiepe kopie genoemd.



Oppervlakkige kopie

De standaardimplementatie van de kloonmethode maakt een ondiepe kopie van het bronobject, het betekent dat er een nieuw exemplaar van het type Object wordt gemaakt, het kopieert alle velden naar een nieuw exemplaar en retourneert een nieuw object van het type ‘Object’. Dit object moet expliciet worden getypecast in het objecttype van het bronobject.

Dit object heeft een exacte kopie van alle velden van het bronobject, inclusief het primitieve type en objectreferenties. Als het bronobject verwijzingen naar andere objecten in het veld bevat, heeft het nieuwe exemplaar alleen verwijzingen naar die objecten, er wordt geen kopie van die objecten gemaakt. Dit betekent dat als we wijzigingen aanbrengen in een ondiepe kopie, de wijzigingen worden weerspiegeld in het bronobject. Beide gevallen zijn niet onafhankelijk.

De kloonmethode in de klasse Object is van nature beschermd, dus niet alle klassen kunnen de methode clone () gebruiken. U moet de Cloneable-interface implementeren en de kloonmethode overschrijven. Als de Cloneable-interface niet is geïmplementeerd, krijgt u CloneNotSupportedException. Super.clone () retourneert een ondiepe kopie volgens de implementatie in de objectklasse.



Code voor ondiepe kopie

package com.test class Department {String empId String grade String aanduiding public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation}} class Werknemer implementeert Cloneable {int id Stringnaam Afdelingsafdeling openbaar Medewerker (int id, Stringnaam, Afdelingafdeling) {this.id = id this.name = naam this.dept = afdeling} // Standaardversie van de clone () -methode. Het creëert een ondiepe kopie van een object. protected Object clone () gooit CloneNotSupportedException {return super.clone ()}} public class ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1', 'A', 'AVP') Medewerker emp1 = nieuwe werknemer (111, 'John', afd1) Werknemer emp2 = null proberen {// Een kloon van emp1 maken en deze toewijzen aan emp2 emp2 = (Werknemer) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // De aanduiding 'emp1' System.out.println (emp1.dept.designation) afdrukken // Uitvoer: AVP // De aanduiding 'emp2' wijzigen emp2.dept.designation = 'Director' // Deze wijziging wordt weerspiegeld in de oorspronkelijke werknemer 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

Uitgang:

Output-Shallow-Copy

In het bovenstaande voorbeeld hebben we een Employee class emp1 met drie klassenvariabelen id (int), name (String) en department (Department).

wat is een tostring-methode in java

We hebben nu emp1 gekloond naar emp2 om een ​​ondiepe kopie te maken, daarna hebben we de aanduiding gewijzigd met behulp van het emp2-object en geverifieerd dat dezelfde veranderingen ook in emp1 werden weerspiegeld.


Diepe kopie

De diepe kopie van een object heeft een exacte kopie van alle velden van het bronobject, zoals een ondiepe kopie, maar in tegenstelling tot sallow-kopie als het bronobject een verwijzing naar object als velden heeft, wordt een replica van het object gemaakt door kloon aan te roepen methode. Dit betekent dat zowel bron- als doelobjecten onafhankelijk van elkaar zijn. Elke wijziging die in het gekloonde object wordt aangebracht, heeft geen invloed op het bronobject.

Code voor diepe kopie

pakket com.test klasse Afdeling implementeert Cloneable {String empId String grade String aanduiding public Department (String empId, String grade, String aanduiding) {this.empId = empId this.grade = grade this.designation = designation} // Standaardversie van kloon () methode. protected Object clone () gooit CloneNotSupportedException {return super.clone ()}} - klasse Werknemer implementeert Cloneable {int id Stringnaam Afdelingsafdeling openbaar Werknemer (int id, Stringnaam, Afdelingsafdeling) {this.id = id this.name = naam this.dept = dept} // De methode clone () overschrijven om een ​​diepe kopie van een object te maken. protected Object clone () gooit CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} public class DeepCopyInJava {public static void main (String [] args) { Afdeling afdeling1 = nieuwe Afdeling ('1', 'A', 'AVP') Werknemer emp1 = nieuwe werknemer (111, 'John', afd1) Werknemer emp2 = null proberen {// Een kloon van emp1 maken en deze toewijzen aan emp2 emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // De aanduiding 'emp1' System.out.println (emp1.dept.designation) // Output: AVP / afdrukken / De aanduiding 'emp2' wijzigen emp2.dept.designation = 'Director' // Deze wijziging zal worden weergegeven in de oorspronkelijke werknemer 'emp1' System.out.println (emp1.dept.designation) // Output: AVP}}

Uitgang:

In het bovenstaande voorbeeld van diepe kopie zijn, in tegenstelling tot ondiepe kopie, zowel bron- als doelobjecten onafhankelijk van elkaar. Elke wijziging die in emp2 wordt aangebracht, heeft geen invloed op emp1.

Verschil tussen ondiepe kopie en diepe kopie

Oppervlakkige kopie Diepe kopie
Gekloond object en bronobject zijn niet volledig onsamenhangendGekloonde objecten en bronobjecten zijn volledig onafhankelijk van elkaar.
Wijzigingen die in de gekloonde instantie worden aangebracht, hebben invloed op de referentievariabele van het bronobjectWijzigingen die in het gekloonde exemplaar worden aangebracht, hebben geen invloed op de referentievariabele van het bronobject.
De standaardversie van de kloon is de ondiepe kopieOm een ​​diepe kopie te maken, moeten we de kloonmethode van de objectklasse overschrijven.
Ondiepe kopie heeft de voorkeur als klassevariabelen van het object alleen primitief type zijn als veldenEen diepe kopie heeft de voorkeur als de klassevariabelen van het object verwijzingen naar andere objecten als velden hebben.
Het is relatief snelHet is relatief traag.

Hiermee komen we aan het einde van het artikel Shallow Copy en Deep Copy. Ik hoop dat je de verschillende verschillen tussen de twee begrijpt.

Bekijk de door Edureka, een vertrouwd online leerbedrijf met een netwerk van meer dan 250.000 tevreden leerlingen verspreid over de hele wereld. De training- en certificeringcursus Java J2EE en SOA van Edureka is bedoeld voor studenten en professionals die Java Developer willen worden.

Heeft u een vraag voor ons? Vermeld het in het commentaargedeelte van deze 'Shallow Copy and Deep Copy' -blog en we nemen zo snel mogelijk contact met je op.