Kako implementirati plitko kopiranje i duboko kopiranje u Javi



Ovaj će vam članak pružiti detaljno i sveobuhvatno znanje o plitkom kopiranju i dubokom kopiranju u Javi s primjerima.

Kloniranje je postupak stvaranja replike ili kopije objekt, metoda klona Java.lang.Object koristi se za stvaranje kopije ili replike objekta. java objekti koji implementiraju Cloneable sučelje ispunjavaju uvjete za upotrebu metode kloniranja. U ovom ćemo članku raspravljati o plitkoj kopiji i dubokoj kopiji sljedećim redoslijedom:

Izrada kopije Java objekta

Možemo stvoriti repliku ili kopiju Java objekta do





1. Stvaranje kopije objekta na drugom memorijskom mjestu. To se naziva duboka kopija.

2. Stvaranje nove reference koja upućuje na isto memorijsko mjesto. To se naziva i Plitka kopija.



Plitka kopija

Zadana implementacija metode kloniranja stvara plitku kopiju izvornog objekta, znači da je stvorena nova instanca tipa Object, kopira sva polja u novu instancu i vraća novi objekt tipa ‘Object’. Ovaj objekt mora izričito biti otkucan u tipu objekta izvornog objekta.

Ovaj će objekt imati točnu kopiju svih polja izvornog objekta, uključujući primitivni tip i reference objekta. Ako izvorni objekt sadrži bilo kakve reference na druge objekte u polju, tada će u novoj instanci imati samo reference na te objekte, kopija tih objekata neće se stvoriti. To znači da ako napravimo promjene u plitkoj kopiji, promjene će se odraziti na izvornom objektu. Obje instance nisu neovisne.

Metoda kloniranja u klasi Objekt zaštićena je u prirodi, pa ne mogu sve klase koristiti metodu kloniranja (). Morate implementirati Cloneable sučelje i nadjačati metodu kloniranja. Ako Cloneable sučelje nije implementirano, dobit ćete CloneNotSupportedException.super.clone () vratit će plitku kopiju prema implementaciji u klasi Object.



Šifra za plitku kopiju

paket com.test class Odjel {String empId String grade Oznaka niza javni odjel (String empId, String grade, String odrednica) {this.empId = empId this.grade = grade this.designation = designation}} klasa Zaposlenik implementira Cloneable {int id Naziv niza Odjel javni odsjek Zaposlenik (int id, Naziv niza, odjel odjela) {this.id = id this.name = name this.dept = dept} // Zadana verzija metode clone (). Stvara plitku kopiju predmeta. zaštićeni objekt clone () baca CloneNotSupportedException {return super.clone ()}} javna klasa ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1', 'A', 'AVP') zaposlenik emp1 = novi zaposlenik (111, 'John', dept1) Zaposlenik emp2 = null try {// Stvaranje klona emp1 i njegovo dodjeljivanje emp2 emp2 = (zaposlenik) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Ispis oznake 'emp1' System.out.println (emp1.dept.designation) // Izlaz: AVP // Promjena oznake 'emp2' emp2.dept.designation = 'Director' // Ova će se promjena odraziti na izvornom zaposleniku 'emp1' System.out.println (emp1.dept.designation) // Izlaz: Direktor}}

Izlaz:

Output-Shallow-Copy

system.exit (0) može se koristiti za prekid programa.

U gornjem primjeru imamo klasu Employee emp1 koja ima tri varijable id-a klase (int), ime (String) i odjel (odjel).

Sada smo klonirali emp1 u emp2 da bismo stvorili plitku kopiju, nakon čega smo promijenili oznaku pomoću objekta emp2 i potvrdili da su se iste promjene odrazile i na emp1.


Duboka kopija

Dubinska kopija objekta imat će točnu kopiju svih polja izvornog objekta poput plitke kopije, ali za razliku od sallow kopije ako izvorni objekt ima bilo kakvu referencu na objekt kao polja, tada se replika objekta stvara pozivanjem klona metoda. To znači da su objekti izvora i odredišta neovisni jedni od drugih. Svaka promjena izvršena u kloniranom objektu neće utjecati na izvorni objekt.

Šifra za duboku kopiju

najbolja java ide za linux
paket com.test class Odjel provodi Cloneable {String empId String grade Oznaka niza javni odjel (String empId, String grade, String odrednica) {this.empId = empId this.grade = grade this.designation = oznaka} // Zadana verzija klona () metoda. zaštićeni objektni klon () baca CloneNotSupportedException {return super.clone ()}} klasu Zaposlenik implementira Cloneable {int id Ime niza Odjel javni Zaposlenik (int id, Ime niza, Odjel) {this.id = id this.name = name this.dept = dept} // Nadjačavanje metode clone () za stvaranje dubinske kopije objekta. zaštićeni objektni klon () baca CloneNotSupportedException {Zaposlenik emp = (Zaposlenik) super.clone () emp.dept = (Odjel) dept.clone () return emp}} javna klasa DeepCopyInJava {javna statička void glavna (String [] args) { Odjel dept1 = novi odjel ('1', 'A', 'AVP') Zaposlenik emp1 = novi zaposlenik (111, 'John', dept1) Zaposlenik emp2 = null try {// Stvaranje klona emp1 i njegovo dodjeljivanje emp2 emp2 = (Zaposlenik) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Ispis oznake 'emp1' System.out.println (emp1.dept.designation) // Izlaz: AVP / / Promjena oznake 'emp2' emp2.dept.designation = 'Director' // Ova će se promjena odraziti na izvornom zaposleniku 'emp1' System.out.println (emp1.dept.designation) // Izlaz: AVP}}

Izlaz:

U gornjem primjeru duboke kopije, za razliku od plitke kopije, objekti izvora i odredišta neovisni su jedni od drugih. Svaka promjena izvršena u emp2 neće utjecati na emp1.

Razlika između plitke i duboke kopije

Plitka kopija Duboka kopija
Klonirani objekt i izvorni objekt nisu u potpunosti međusobno razdvojeniKlonirani objekti i izvorni objekti potpuno su neovisni jedni o drugima.
Promjene izvršene u kloniranoj instanci utjecat će na referentnu varijablu izvornog objektaIzmjene izvršene u kloniranoj instanci neće utjecati na referentnu varijablu izvornog objekta.
Zadana verzija klona je plitka kopijaDa bismo stvorili dubinsku kopiju, moramo nadjačati metodu kloniranja klase Objekt.
Plitka kopija je poželjna ako su varijable klase objekta samo primitivni tip kao poljaPoželjna je dubinska kopija ako varijable klase objekta imaju reference na druge objekte kao polja.
Relativno je brzRelativno je spor.

Ovim smo došli do kraja članka o Plitkom kopiranju i Dubinskom kopiranju. Nadam se da ste razumjeli razne razlike između njih dvoje.

Pogledajte Edureka, pouzdana tvrtka za internetsko učenje s mrežom od više od 250 000 zadovoljnih učenika raširenih širom svijeta. Edurekin tečaj za obuku i certificiranje Java J2EE i SOA namijenjen je studentima i profesionalcima koji žele biti programer Java.

Imate pitanje za nas? Molimo vas da ga spominjete u odjeljku za komentare ovog bloga „Plitko kopiranje i duboko kopiranje“, a mi ćemo vam se javiti što je prije moguće.