Cum se implementează copierea superficială și copierea profundă în Java



Acest articol vă va oferi o cunoaștere detaliată și cuprinzătoare despre copierea superficială și copierea profundă în Java cu exemple.

Clonarea este un proces de creare a unei replici sau a unei copii a obiect, metodă de clonare Java.lang.Object este utilizat pentru a crea o copie sau o replică a unui obiect. obiectele java care implementează interfața clonabilă sunt eligibile pentru utilizarea metodei clonării. În acest articol, vom discuta despre copierea superficială și copierea profundă în următoarea ordine:

Crearea copiei obiectului Java

Putem crea o replică sau o copie a obiectului java prin





1. Crearea unei copii a obiectului într-o altă locație de memorie. Aceasta se numește o copie profundă.

2. Crearea unei noi referințe care indică aceeași locație de memorie. Aceasta se mai numește și o copie Shallow.



Copiere superficială

Implementarea implicită a metodei de clonare creează o copie superficială a obiectului sursă, înseamnă că este creată o nouă instanță de tip Object, copiază toate câmpurile într-o nouă instanță și returnează un nou obiect de tipul ‘Object’. Acest obiect trebuie în mod explicit să fie tipografiat în tipul de obiect al obiectului sursă.

Acest obiect va avea o copie exactă a tuturor câmpurilor obiectului sursă, inclusiv referințele de tip primitiv și obiect. Dacă obiectul sursă conține referințe la alte obiecte din câmp, atunci în noua instanță va avea doar referințe la acele obiecte, nu se creează o copie a acestor obiecte. Aceasta înseamnă că dacă facem modificări în copie superficială, modificările se vor reflecta în obiectul sursă. Ambele instanțe nu sunt independente.

Metoda clonării din clasa Object este protejată în natură, deci nu toate clasele pot utiliza metoda clone (). Trebuie să implementați interfața clonabilă și să înlocuiți metoda clonării. Dacă interfața Cloneable nu este implementată, atunci veți obține CloneNotSupportedException.super.clone () va returna o copie superficială conform implementării în clasa Object.



Cod pentru copiere superficială

package com.test class Department {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = nota this.designation = designation}} clasă Angajat implementează Clonabil {int id Numele șirului Departamentul departamentului public Angajat (int id, Numele șirului, departamentul departamentului) {this.id = id this.name = nume this.dept = dept} // Versiunea implicită a metodei clone (). Se creează o copie superficială a unui obiect. Clone Object protejat () aruncă CloneNotSupportedException {return super.clone ()}} clasă publică ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1', 'A', 'AVP') Angajat emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Crearea unei clone de emp1 și atribuirea acesteia către emp2 emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Tipărirea denumirii „emp1” System.out.println (emp1.dept.designation) // Ieșire: AVP // Modificarea denumirii „emp2” emp2.dept.designation = „Director” // Această modificare se va reflecta în sistemul „emp1” original al angajaților System.out.println (emp1.dept.designation) // Ieșire: Director}}

Ieșire:

Output-Shallow-Copy

În exemplul de mai sus, avem o clasă de angajați emp1 care are trei variabile de clasă id (int), nume (Șir) și departament (Departament).

java copie profundă vs copie superficială

Acum am clonat emp1 în emp2 pentru a crea o copie superficială, după care am schimbat denumirea folosind obiectul emp2 și am verificat că aceleași modificări s-au reflectat și în emp1.


Deep Copy

Copia profundă a unui obiect va avea o copie exactă a tuturor câmpurilor obiectului sursă, cum ar fi o copie superficială, dar spre deosebire de copia mică, dacă obiectul sursă are o referință la obiect ca câmpuri, atunci se creează o replică a obiectului prin apelarea clonei metodă. Aceasta înseamnă că atât obiectele sursă, cât și cele de destinație sunt independente unele de altele. Orice modificare făcută în obiectul clonat nu va avea impact asupra obiectului sursă.

Cod pentru Deep Copy

cum se folosesc semaforele în java
pachet com.test class Departamentul implementează Clonabil {String empId String grade Denumire șir Departament public (String empId, String grade, String designation) {this.empId = empId this.grade = nota this.designation = designation} // Versiunea implicită a clonei () metoda. Clone Object protejate () aruncă CloneNotSupportedException {return super.clone ()}} clasă Angajat implementează Clonabil {int id Nume șir Departament departament public Angajat (int id, Nume șir, Departament departament) {this.id = id this.name = nume this.dept = dept} // Metoda overriding clone () pentru a crea o copie profundă a unui obiect. Clone Object protejate () aruncă CloneNotSupportedException {Angajat emp = (Angajat) super.clone () emp.dept = (Departament) dept.clone () return emp}} clasă publică DeepCopyInJava {public static void main (String [] args) { Departament departament = departament nou („1”, „A”, „AVP”) Angajat emp1 = angajat nou (111, „Ioan”, departament1) Angajat emp2 = încercare nulă {// Crearea unei clone de emp1 și atribuirea acestuia la emp2 emp2 = (Angajat) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Tipărirea denumirii „emp1” System.out.println (emp1.dept.designation) // Ieșire: AVP / / Modificarea desemnării „emp2” emp2.dept.designation = 'Director' // Această modificare va fi reflectată în „emp1” System.out.println (emp1.dept.designation) original al angajaților // Ieșire: AVP}}

Ieșire:

În exemplul de mai sus de copiere profundă, spre deosebire de copierea superficială, ambele obiecte sursă și destinație sunt independente una de cealaltă. Orice modificare făcută în emp2 nu va avea impact pe emp1.

Diferența dintre copierea superficială și copia profundă

Copiere superficială Deep Copy
Obiectul clonat și obiectul sursă nu sunt complet disjuncteObiectele clonate și obiectele sursă sunt complet independente una de cealaltă.
Modificările făcute în instanța clonată vor avea impact asupra variabilei de referință a obiectului sursăModificările făcute în instanța clonată nu vor afecta variabila de referință a obiectului sursă.
Versiunea implicită a clonei este copia superficialăPentru a crea o copie profundă, trebuie să înlocuim metoda clonării clasei Object.
Copierea superficială este preferată dacă variabilele de clasă ale obiectului sunt doar tip primitiv ca câmpuriO copie profundă este preferată dacă variabilele de clasă ale obiectului au referințe la alte obiecte ca câmpuri.
Este relativ rapidEste relativ lent.

Cu aceasta, ajungem la sfârșitul articolului Shallow Copy și Deep Copy. Sper că ați înțeles diferitele diferențe dintre cele două.

Verificați de Edureka, o companie de învățare online de încredere, cu o rețea de peste 250.000 de elevi mulțumiți răspândiți pe tot globul. Cursul de formare și certificare Java J2EE și SOA al Edureka este conceput pentru studenți și profesioniști care doresc să fie dezvoltator Java.

Ai o întrebare pentru noi? Vă rugăm să o menționați în secțiunea de comentarii a acestui blog „Copiere superficială și copiere profundă” și vă vom contacta cât mai curând posibil.