Kako uporabiti plitko kopiranje in globoko kopiranje v Javi



Ta članek vam bo zagotovil podrobno in celovito znanje o plitkem kopiranju in globinskem kopiranju v Javi s primeri.

Kloniranje je postopek ustvarjanja replike ali kopije datoteke objekt, metoda klona Java.lang.Object se uporablja za ustvarjanje kopije ali replike predmeta. predmeti java, ki izvajajo vmesnik Cloneable, so primerni za uporabo metode kloniranja. V tem članku bomo obravnavali plitvo kopijo in globoko kopijo v naslednjem vrstnem redu:

Ustvarjanje kopije Java predmeta

Lahko ustvarimo kopijo ali kopijo predmeta java do





1. Ustvarjanje kopije predmeta na drugem pomnilniškem mestu. Temu pravimo globoka kopija.

2. Ustvarjanje novega sklica, ki kaže na isto lokacijo pomnilnika. Temu pravimo tudi plitka kopija.



Plitva kopija

Privzeta izvedba metode clone ustvari plitvo kopijo izvornega predmeta, kar pomeni, da je ustvarjen nov primerek tipa Object, kopira vsa polja v nov primerek in vrne nov objekt tipa ‘Object’. Ta objekt je treba izrecno vtipkati v vrsto predmeta izvornega predmeta.

Ta objekt bo imel natančno kopijo vseh polj izvornega predmeta, vključno s primitivnimi vrstami in referencami na objekt. Če izvorni objekt vsebuje kakršne koli sklice na druge predmete v polju, bodo v novem primerku samo sklici na te predmete, kopija teh predmetov ne bo ustvarjena. To pomeni, da če spremembe naredimo v plitki kopiji, se bodo spremembe odražale v izvornem objektu. Oba primera nista neodvisna.

Metoda kloniranja v razredu Object je v naravi zaščitena, zato vsi razredi ne morejo uporabiti metode clone (). Izvesti morate vmesnik Cloneable in preglasiti metodo kloniranja. Če vmesnik Cloneable ni izveden, boste dobili CloneNotSupportedException.super.clone () bo vrnil plitvo kopijo glede na izvedbo v razredu Object.



Koda za plitvo kopiranje

paket com.test class Department {String empId String grade Oznaka niza public Department (String empId, String grade, String Oznaka) {this.empId = empId this.grade = grade this.designation = designation}} class Zaposleni izvaja Cloneable {int id Ime niza Oddelek za javno službo Zaposleni (int id, Ime niza, oddelek za oddelke) {this.id = id this.name = ime this.dept = dept} // Privzeta različica metode clone (). Ustvari plitvo kopijo predmeta. klon zaščitenega predmeta () vrže CloneNotSupportedException {return super.clone ()}} javni razred ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1', 'A', 'AVP') Zaposleni emp1 = novi zaposleni (111, 'John', dept1) Zaposleni emp2 = null try {// Ustvari klon emp1 in ga dodeli emp2 emp2 = (zaposleni) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Tiskanje oznake 'emp1' System.out.println (emp1.dept.designation) // Izhod: AVP // Spreminjanje oznake 'emp2' emp2.dept.designation = 'Director' // Ta sprememba bo prikazana v prvotnem zaposlenem 'emp1' System.out.println (emp1.dept.designation) // Rezultat: direktor}}

Izhod:

kako preveriti palindrom v javi -

Output-Shallow-Copy

V zgornjem primeru imamo razred Employee emp1, ki ima tri spremenljivke razreda id (int), ime (String) in oddelek (Department).

Zdaj smo klonirali emp1 v emp2, da smo ustvarili plitvo kopijo, nato pa smo z namenom emp2 spremenili oznako in preverili, da so se iste spremembe odražale tudi v emp1.


Globoka kopija

Globoka kopija predmeta bo imela natančno kopijo vseh polj izvornega predmeta, kot je plitka kopija, vendar za razliko od sallow kopije, če ima izvorni objekt kakršen koli sklic na predmet kot polja, potem kopija klica nastane s klicem clone metoda. To pomeni, da sta tako izvorni kot ciljni objekt neodvisna drug od drugega. Kakršna koli sprememba kloniranega predmeta ne bo vplivala na izvorni objekt.

Koda za globoko kopiranje

paket com.test class Oddelek izvaja Cloneable {String empId String grade Oznaka niza javni oddelek (String empId, String grade, String Oznaka) {this.empId = empId this.grade = grade this.designation = oznaka} // Privzeta različica klona () metoda. klon zaščitenega predmeta () vrže CloneNotSupportedException {return super.clone ()}} razred Zaposleni izvaja Cloneable {int id Ime niza Oddelek javni odsek Zaposleni (int id, ime niza, oddelek oddelka) {this.id = id this.name = name this.dept = dept} // Preglasitev metode clone () za ustvarjanje globoke kopije predmeta. klon zaščitenega predmeta () vrže CloneNotSupportedException {Zaposleni emp = (Zaposleni) super.clone () emp.dept = (Oddelek) dept.clone () return emp}} javni razred DeepCopyInJava {javna statična void glavna (String [] args) { Oddelek dept1 = nov oddelek ('1', 'A', 'AVP') Zaposleni emp1 = nov zaposleni (111, 'John', dept1) Zaposleni emp2 = null try {// Ustvari klon emp1 in ga dodeli emp2 emp2 = (Zaposlen) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Tiskanje oznake 'emp1' System.out.println (emp1.dept.designation) // Izhod: AVP / / Spreminjanje oznake 'emp2' emp2.dept.designation = 'Director' // Ta sprememba se bo odražala v prvotnem zaposlenem 'emp1' System.out.println (emp1.dept.designation) // Izhod: AVP}}

Izhod:

V zgornjem primeru globoke kopije so za razliko od plitke kopije tako izvorni kot ciljni objekti neodvisni drug od drugega. Kakršna koli sprememba v emp2 ne bo vplivala na emp1.

Razlika med plitkim kopiranjem in globokim kopiranjem

Plitva kopija Globoka kopija
Klonirani objekt in izvorni objekt nista popolnoma ločenaKlonirani predmeti in izvorni predmeti so popolnoma neodvisni drug od drugega.
Spremembe v kloniranem primerku bodo vplivale na referenčno spremenljivko izvornega predmetaSpremembe v kloniranem primerku ne bodo vplivale na referenčno spremenljivko izvornega predmeta.
Privzeta različica klona je plitva kopijaČe želite ustvariti globoko kopijo, moramo preglasiti metodo kloniranja razreda Object.
Plitka kopija je zaželena, če so spremenljivke razreda predmeta samo primitivni tip kot poljaZaželena je globoka kopija, če imajo spremenljivke razreda predmeta sklice na druge predmete kot polja.
Sorazmerno je hiterJe razmeroma počasen.

S tem smo prišli do konca članka o Plitvi kopiji in Globoki kopiji. Upam, da ste razumeli različne razlike med njima.

Oglejte si Edureka, zaupanja vredno podjetje za spletno učenje z mrežo več kot 250.000 zadovoljnih učencev, razširjenih po vsem svetu. Edurekin tečaj za usposabljanje in certificiranje Java J2EE in SOA je namenjen študentom in strokovnjakom, ki želijo biti razvijalec Java.

Imate vprašanje za nas? Prosimo, omenite ga v oddelku za komentarje tega spletnega dnevnika »Plitvo kopiranje in globoko kopiranje«, mi se vam bomo oglasili v najkrajšem možnem času.