Kā ieviest seklu un dziļu kopēšanu Java



Šis raksts sniegs jums detalizētas un visaptverošas zināšanas par seklo un dziļo kopēšanu Java ar piemēriem.

Klonēšana ir kopijas vai kopijas izveidošanas process objekts, klona metode Java.lang.Object tiek izmantots, lai izveidotu objekta kopiju vai kopiju. java objekti, kas ievieš Cloneable interfeisu, ir piemēroti klona metodes izmantošanai. Šajā rakstā mēs apspriedīsim seklo un dziļo kopiju šādā secībā:

Java objekta kopijas izveide

Mēs varam izveidot java objekta kopiju vai kopiju





1. Objekta kopijas izveidošana citā atmiņas vietā. To sauc par dziļu kopiju.

2. Izveidojiet jaunu atsauci, kas norāda uz to pašu atmiņas vietu. To sauc arī par seklu kopiju.



Sekla kopija

Klona metodes noklusējuma ieviešana rada avota objekta seklu kopiju, tas nozīmē, ka tiek izveidots jauns Object tipa eksemplārs, tas visus laukus nokopē uz jaunu instanci un atgriež jaunu objekta tipu ‘Object’. Šis objekts nepārprotami ir jāievada avota objekta objekta tipā.

Šim objektam būs precīza visu avota objekta lauku kopija, ieskaitot primitīvo tipu un objekta atsauces. Ja avota objektā ir kādas atsauces uz citiem lauka objektiem, jaunajā instancē būs tikai atsauces uz šiem objektiem, šo objektu kopija netiek izveidota. Tas nozīmē, ka, ja mēs veicam izmaiņas seklā eksemplārā, izmaiņas tiks atspoguļotas avota objektā. Abas instances nav neatkarīgas.

Klona metode Object klasē ir aizsargāta pēc būtības, tāpēc ne visas klases var izmantot clone () metodi. Jums jāievieš Cloneable interfeiss un jāignorē klona metode. Ja Cloneable interfeiss nav ieviests, jūs saņemsit CloneNotSupportedException.super.clone () atgriezīs seklu eksemplāru atbilstoši īstenošanai Object klasē.



Seklas kopijas kods

pakete com.test klase Departaments {String empId Virknes pakāpe Virknes apzīmējums publiskais departaments (String empId, Virknes pakāpe, Virknes apzīmējums) {this.empId = empId this.grade = pakāpe this.designation = apzīmējums}} klase Darbinieki ievieš Clonable {int id Virknes nosaukums Departamenta departaments publiskais darbinieks (int id, String name, Department dept) {this.id = id this.name = nosaukums this.dept = dept} // Metode Klona () noklusējuma versija. Tas rada sekla objekta kopiju. aizsargāts objekta klons () izmet CloneNotSupportedException {return super.clone ()}} publiskā klase ShallowCopyInJava {public static void main (String [] argumenti) {Department dept1 = new Department ('1', 'A', 'AVP') Darbinieks emp1 = new Employee (111, 'John', dept1) Darbinieks emp2 = null mēģiniet {// Izveidot emp1 klonu un piešķirt to emp2 emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // “emp1” apzīmējuma drukāšana System.out.println (emp1.dept.designation) // Output: AVP // “emp2” apzīmējuma maiņa emp2.dept.designation = 'Director' // Šīs izmaiņas tiks atspoguļotas sākotnējā darbinieka 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

Izeja:

Output-Shallow-Copy

Iepriekš minētajā piemērā mums ir Employee class emp1, kuram ir trīs klases mainīgā ID (int), nosaukums (String) un departaments (Department).

Tagad mēs klonējām emp1 uz emp2, lai izveidotu seklu kopiju, pēc tam mēs mainījām apzīmējumu, izmantojot emp2 objektu, un pārbaudījām, vai tās pašas izmaiņas tika atspoguļotas arī emp1.


Dziļa kopija

Objekta dziļajā eksemplārā būs precīza visu avota objekta lauku kopija, piemēram, sekla kopija, bet atšķirībā no slaidās kopijas, ja avota objektam ir kāda atsauce uz objektu kā laukiem, tad, izsaucot klonu, tiek izveidota objekta kopija metodi. Tas nozīmē, ka gan avota, gan mērķa objekti ir neatkarīgi viens no otra. Jebkuras izmaiņas, kas veiktas klonētajā objektā, neietekmēs avota objektu.

Dziļās kopēšanas kods

Datorurķēšanas plusi un mīnusi
pakete com.test class Departaments ievieš Cloneable {String empId String grade String apzīmējums public Department (String empId, String grade, String apzīmējums) {this.empId = empId this.grade = grade this.designation = designation} // Klona noklusējuma versija () metode. aizsargāts objekta klons () izmet CloneNotSupportedException {return super.clone ()}} klase Darbinieks ievieš Cloneable {int id String name Department dept public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Klona () ignorēšanas metode objekta dziļas kopijas izveidošanai. aizsargāts objekta klons () izmet CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} public class DeepCopyInJava {public static void main (String [] args) { Nodaļas dept1 = jauns departaments ('1', 'A', 'AVP') Darbinieks emp1 = jauns darbinieks (111, 'John', dept1) Darbinieks emp2 = null mēģinājums {// Izveidot emp1 klonu un piešķirt to emp2 emp2 = (Darbinieks) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Nosaukuma “emp1” drukāšana System.out.println (emp1.dept.designation) // Izeja: AVP / / 'Emp2' apzīmējuma maiņa emp2.dept.designation = 'Director' // Šīs izmaiņas tiks atspoguļotas sākotnējā Employee 'emp1' System.out.println (emp1.dept.designation) // Output: AVP}}

Izeja:

Iepriekš minētajā dziļās kopijas piemērā atšķirībā no seklās kopijas gan avota, gan mērķa objekti ir neatkarīgi viens no otra. Jebkuras izmaiņas, kas veiktas emp2, neietekmēs emp1.

Starpība starp seklu un dziļu kopiju

Sekla kopija Dziļa kopija
Klonētais objekts un avota objekts nav pilnībā atdalītiKlonētie objekti un avota objekti ir pilnīgi neatkarīgi viens no otra.
Klonētajā instancē veiktās izmaiņas ietekmēs avota objekta atsauces mainīgoKlonētajā instancē veiktās izmaiņas neietekmēs avota objekta atsauces mainīgo.
Klona noklusējuma versija ir sekla kopijaLai izveidotu dziļu kopiju, mums jāignorē objektu klases klona metode.
Sekla kopija ir vēlama, ja objekta klases mainīgie kā lauki ir tikai primitīviDziļa kopija ir vēlama, ja objekta klases mainīgajiem ir atsauces uz citiem objektiem kā laukiem.
Tas ir samērā ātriTas ir samērā lēns.

Ar to mēs esam nonākuši raksta Seklā kopija un Dziļā kopija beigās. Es ceru, ka jūs sapratāt dažādas atšķirības starp abiem.

Pārbaudiet Autors: Edureka, uzticams tiešsaistes mācību uzņēmums ar vairāk nekā 250 000 apmierinātu izglītojamo tīklu visā pasaulē. Edureka Java J2EE un SOA apmācības un sertifikācijas kurss ir paredzēts studentiem un profesionāļiem, kuri vēlas būt Java izstrādātāji.

Vai mums ir jautājums? Lūdzu, pieminējiet to šī emuāra “Sekla kopija un dziļa kopija” komentāru sadaļā, un mēs sazināsimies ar jums pēc iespējas ātrāk.