Hvordan implementere grunne kopier og dype kopier i Java



Denne artikkelen vil gi deg en detaljert og omfattende kunnskap om Shallow Copy og Deep Copy i Java med eksempler.

Kloning er en prosess for å lage en kopi eller kopi av objekt, klonmetode Java.lang.Object brukes til å lage kopi eller replika av et objekt. java-objekter som implementerer Cloneable interface er kvalifisert for å bruke klonmetoden. I denne artikkelen vil vi diskutere Shallow Copy og Deep Copy i følgende rekkefølge:

Opprette kopi av Java-objekt

Vi kan lage en kopi eller kopi av java-objektet ved





1. Lage en kopi av objektet på et annet minneplass. Dette kalles en dyp kopi.

2. Opprette en ny referanse som peker til samme minneplassering. Dette kalles også en grunne kopi.



Grunn kopi

Standardimplementeringen av klonmetoden skaper en grunne kopi av kildeobjektet, det betyr at en ny forekomst av typen Objekt blir opprettet, den kopierer alle feltene til en ny forekomst og returnerer et nytt objekt av typen 'Objekt'. Dette objektet må eksplisitt skrives inn i objekttypen for kildeobjektet.

Dette objektet vil ha en nøyaktig kopi av alle feltene til kildeobjektet, inkludert den primitive typen og objektreferanser. Hvis kildeobjektet inneholder noen referanser til andre objekter i feltet, vil den nye forekomsten bare ha referanser til disse objektene, og en kopi av disse objektene blir ikke opprettet. Dette betyr at hvis vi gjør endringer i grunne kopier, vil endringene gjenspeiles i kildeobjektet. Begge tilfeller er ikke uavhengige.

Klonmetoden i Objektklasse er beskyttet i naturen, så ikke alle klasser kan bruke klonemetoden (). Du må implementere Cloneable interface og overstyre klonmetoden. Hvis det klonable grensesnittet ikke er implementert, får du CloneNotSupportedException.super.clone () vil returnere grunne kopier i henhold til implementering i objektklasse.



forskjell mellom grensesnitt og klasse

Kode for grunne kopier

pakke com.test klasse Avdeling {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation}} class Medarbeider implementerer Cloneable {int id Strengnavn Avdelingsavdeling offentlig Ansatt (int id, String navn, Avdeling avd.) {This.id = id this.name = name this.dept = avd.} // Standardversjon av clone () -metoden. Det skaper grunne kopier av et objekt. beskyttet objektklon () kaster CloneNotSupportedException {retur super.clone ()}} offentlig klasse ShallowCopyInJava {offentlig statisk ugyldig hoved (String [] args) {Avdeling dept1 = ny avdeling ('1', 'A', 'AVP') Ansatt emp1 = ny ansatt (111, 'John', avd. 1) Ansatt emp2 = null prøv {// Opprette en klon av emp1 og tildele den til emp2 emp2 = (ansatt) emp1.clone ()} fangst (CloneNotSupportedException e) {e. printStackTrace ()} // Utskrift av betegnelsen 'emp1' System.out.println (emp1.dept.designation) // Output: AVP // Endring av betegnelsen 'emp2' emp2.dept.designation = 'Director' // Denne endringen vil gjenspeiles i den opprinnelige ansattes 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

Produksjon:

Output-Shallow-Copy

bruk av pakker i java

I eksemplet ovenfor har vi en ansatt klasse emp1 som har tre klassevariabler id (int), navn (streng) og avdeling (avdeling).

Vi klonet nå emp1 til emp2 for å lage en grunne kopi, etter det endret vi betegnelsen ved hjelp av emp2-objektet og bekreftet at de samme endringene også gjenspeiles i emp1.


Dyp kopi

Den dype kopien av et objekt vil ha en eksakt kopi av alle feltene til kildeobjektet, som en grunne kopi, men i motsetning til sallow copy hvis kildeobjektet har noen referanse til objektet som felt, blir en kopi av objektet opprettet ved å ringe klon metode. Dette betyr at både kilde- og målobjekter er uavhengige av hverandre. Enhver endring som er gjort i det klonede objektet, vil ikke påvirke kilden.

Kode for dyp kopi

pakke com.test klasse Avdeling implementerer Cloneable {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // Standardversjon av klon () metode. beskyttet objektklon () kaster CloneNotSupportedException {return super.clone ()}} klasse Ansatt implementerer Cloneable {int id Strengnavn Avdeling avd. offentlig ansatt (int id, Strengnavn, Avdeling avd.) {this.id = id this.name = name this.dept = dept} // Overriding clone () -metoden for å lage en dyp kopi av et objekt. beskyttet objekt klon () kaster CloneNotSupportedException {ansatt emp = (ansatt) super.clone () emp.dept = (avdeling) dept.clone () retur emp}} offentlig klasse DeepCopyInJava {offentlig statisk ugyldig hoved (String [] args) { Avdeling dept1 = ny avdeling ('1', 'A', 'AVP') Ansatt emp1 = ny ansatt (111, 'John', avd1) Ansatt emp2 = null prøve {// Opprette en klon av emp1 og tildele den til emp2 emp2 = (Ansatt) emp1.clone ()} fangst (CloneNotSupportedException e) {e.printStackTrace ()} // Utskrift av betegnelsen 'emp1' System.out.println (emp1.dept.designation) // Output: AVP / / Endring av betegnelsen 'emp2' emp2.dept.designation = 'Director' // Denne endringen vil gjenspeiles i den opprinnelige ansattes 'emp1' System.out.println (emp1.dept.designation) // Output: AVP}}

Produksjon:

I eksemplet ovenfor med Deep copy, i motsetning til grunne kopier, er både kilde- og destinasjonsobjekter uavhengige av hverandre. Enhver endring i emp2 vil ikke påvirke emp1.

Forskjellen mellom lav kopi og dyp kopi

Grunn kopi Dyp kopi
Klonet objekt og kildeobjekt henger ikke helt sammenKlonede gjenstander og kildeobjekter er helt uavhengige av hverandre.
Endringer som er gjort i den klonede forekomsten, vil påvirke referansevariabelen til kildeobjektetEndringer som er gjort i den klonede forekomsten, vil ikke påvirke referansevariabelen til kildeobjektet.
Standardversjonen av klonen er den grunne kopienFor å lage dyp kopi må vi overstyre klonmetoden til Object-klasse.
Grunn kopi foretrekkes hvis klassevariabler for objektet bare er primitive som feltEn dyp kopi foretrekkes hvis objektets klassevariabler har referanser til andre objekter som felt.
Det er relativt rasktDet er relativt tregt.

Med dette kommer vi til slutten av Shallow Copy og Deep Copy-artikkelen. Jeg håper du fikk forståelse for de forskjellige forskjellene mellom de to.

lage en rekke objekter

Sjekk ut av Edureka, et pålitelig online læringsfirma med et nettverk av mer enn 250 000 fornøyde elever spredt over hele verden. Edurekas Java J2EE- og SOA-opplæring og sertifiseringskurs er designet for studenter og fagpersoner som ønsker å være Java-utvikler.

Har du et spørsmål til oss? Vennligst nevn det i kommentarfeltet i denne 'Shallow Copy and Deep Copy' -bloggen, så kommer vi tilbake til deg så snart som mulig.