Sådan implementeres Shallow Copy og Deep Copy i Java



Denne artikel giver dig en detaljeret og omfattende viden om Shallow Copy og Deep Copy i Java med eksempler.

Kloning er en proces til oprettelse af en replika eller kopi af objekt, klonmetode Java.lang.Object bruges til at oprette kopi eller replika af et objekt. java-objekter, der implementerer Cloneable-interface, er berettigede til at bruge klonmetoden. I denne artikel vil vi diskutere Shallow Copy og Deep Copy i følgende rækkefølge:

Oprettelse af kopi af Java-objekt

Vi kan oprette en replika eller kopi af java-objekt ved





1. Oprettelse af en kopi af objektet på et andet hukommelsessted. Dette kaldes en dyb kopi.

2. Oprettelse af en ny reference, der peger på den samme hukommelsesplacering. Dette kaldes også en lav kopi.



Lav kopi

Standardimplementeringen af ​​klonmetoden opretter en lav kopi af kildeobjektet, det betyder, at der oprettes en ny forekomst af typen Objekt, den kopierer alle felterne til en ny forekomst og returnerer et nyt objekt af typen 'Objekt'. Dette objekt skal eksplicit skrives i objekttypen for kildeobjektet.

Dette objekt har en nøjagtig kopi af alle felterne i kildeobjektet inklusive den primitive type og objektreferencer. Hvis kildeobjektet indeholder referencer til andre objekter i feltet, vil der i den nye forekomst kun have referencer til disse objekter, en kopi af disse objekter oprettes ikke. Dette betyder, at hvis vi foretager ændringer i overfladisk kopi, så reflekteres ændringer i kildeobjektet. Begge tilfælde er ikke uafhængige.

Klonmetoden i objektklassen er beskyttet i naturen, så ikke alle klasser kan bruge metoden klon (). Du skal implementere Cloneable interface og tilsidesætte klonmetoden. Hvis den Cloneable-grænseflade ikke er implementeret, får du CloneNotSupportedException.super.clone () vil returnere en lav kopi pr. Implementering i objektklassen.



Kode til lav kopi

pakke com.test klasse Afdeling {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation}} klasse Medarbejder implementerer Cloneable {int id Strengnavn Afdelingsafdeling offentlig Medarbejder (int id, Strengnavn, Afdelingsafdeling) {this.id = id this.name = name this.dept = dept} // Standardversion af klon () -metoden. Det skaber en lav kopi af et objekt. beskyttet objektklon () kaster CloneNotSupportedException {return super.clone ()}} offentlig klasse ShallowCopyInJava {offentlig statisk ugyldig hoved (String [] args) {Afdelingsafd. emp1 = ny medarbejder (111, 'John', dept1) Medarbejder emp2 = nul prøve {// Oprettelse af en klon af emp1 og tildeling til emp2 emp2 = (medarbejder) emp1.clone ()} fangst (CloneNotSupportedException e) {e. printStackTrace ()} // Udskrivning af betegnelsen 'emp1' System.out.println (emp1.dept.designation) // Output: AVP // Ændring af betegnelsen 'emp2' emp2.dept.designation = 'Director' // Denne ændring afspejles i den oprindelige medarbejder 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

Produktion:

Output-Shallow-Copy

I ovenstående eksempel har vi en medarbejderklasse emp1, som har tre klassevariabler id (int), navn (streng) og afdeling (afdeling).

Vi klonede nu emp1 til emp2 for at oprette en lav kopi, derefter ændrede vi betegnelsen ved hjælp af emp2-objektet og verificerede, at de samme ændringer også blev reflekteret i emp1.


Dyb kopi

Den dybe kopi af et objekt vil have en nøjagtig kopi af alle felterne i kildeobjektet som en lav kopi, men i modsætning til lav kopi, hvis kildeobjektet har nogen henvisning til objektet som felter, oprettes der en replika af objektet ved at kalde klon metode. Dette betyder, at både kilde- og destinationsobjekter er uafhængige af hinanden. Enhver ændring foretaget i det klonede objekt påvirker ikke kildeobjektet.

Kode til dyb kopi

pakke com.test klasse Afdeling implementerer klonabel {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // Standardversion af klon () metode. beskyttet objektklon () kaster CloneNotSupportedException {return super.clone ()}} klasse Medarbejder implementerer Cloneable {int id Strengnavn Afdelingsafd. offentlig Medarbejder (int id, String navn, Afdelingsafd.) this.dept = dept} // Overriding clone () metode til at oprette en dyb kopi af et objekt. beskyttet Objektklon () kaster CloneNotSupportedException {Medarbejder emp = (Medarbejder) super.clone () emp.dept = (Afdeling) dept.clone () returner emp}} offentlig klasse DeepCopyInJava {offentlig statisk ugyldig hoved (String [] args) { Afdeling dept1 = ny afdeling ('1', 'A', 'AVP') Medarbejder emp1 = ny medarbejder (111, 'John', afd. 1) Medarbejder emp2 = nul prøve {// Oprettelse af en klon af emp1 og tildeling til emp2 emp2 = (Medarbejder) emp1.clone ()} fangst (CloneNotSupportedException e) {e.printStackTrace ()} // Udskrivning af betegnelsen 'emp1' System.out.println (emp1.dept.designation) // Output: AVP / / Ændring af betegnelsen 'emp2' emp2.dept.designation = 'Director' // Denne ændring afspejles i den oprindelige medarbejder 'emp1' System.out.println (emp1.dept.designation) // Output: AVP}}

Produktion:

forskel mellem metodeoverbelastning og metodeoverstyring

I ovenstående eksempel på dyb kopi er, i modsætning til lav kopi, både kilde- og destinationsobjekter uafhængige af hinanden. Enhver ændring foretaget i emp2 påvirker ikke emp1.

Forskellen mellem lav kopi og dyb kopi

Lav kopi Dyb kopi
Klonet objekt og kildeobjekt adskiller sig ikke heltKlonede objekter og kildeobjekter er helt uafhængige af hinanden.
Ændringer foretaget i den klonede forekomst vil påvirke kildeobjektets referencevariabelÆndringer foretaget i den klonede forekomst påvirker ikke kildeobjektets referencevariabel.
Standardversionen af ​​klonen er den lave kopiFor at oprette dyb kopi er vi nødt til at tilsidesætte klonmetoden til objektklasse.
Lav kopi foretrækkes, hvis objektets klassevariabler kun er primitive som felterEn dyb kopi foretrækkes, hvis objektets klassevariabler har henvisninger til andre objekter som felter.
Det er relativt hurtigtDet er relativt langsomt.

Med dette kommer vi til slutningen af ​​artiklen Shallow Copy og Deep Copy. Jeg håber, du har forstået de forskellige forskelle mellem de to.

Tjek af Edureka, et pålideligt online læringsfirma med et netværk på mere end 250.000 tilfredse elever spredt over hele kloden. Edurekas Java J2EE- og SOA-uddannelses- og certificeringskursus er designet til studerende og fagfolk, der ønsker at være Java-udvikler.

Har du et spørgsmål til os? Nævn det i kommentarfeltet på denne 'Shallow Copy and Deep Copy' -blog, og vi vender tilbage til dig hurtigst muligt.