Com implementar la còpia superficial i la còpia profunda a Java



Aquest article us proporcionarà un coneixement detallat i complet de Shallow Copy i Deep Copy a Java amb exemples.

La clonació és un procés per crear una rèplica o una còpia de object, mètode de clonació Java.lang.Object s’utilitza per crear còpia o rèplica d’un objecte. Els objectes java que implementen la interfície clonable són elegibles per utilitzar el mètode de clonació. En aquest article, parlarem de la còpia superficial i la còpia profunda en l’ordre següent:

Creació d'una còpia de l'objecte Java

Podem crear una rèplica o una còpia de l'objecte java mitjançant





1. Creació d'una còpia de l'objecte en una ubicació de memòria diferent. Això s’anomena còpia profunda.

2. Creació d'una nova referència que apunti a la mateixa ubicació de memòria. Això també s’anomena còpia poc profunda.



Còpia poc profunda

La implementació per defecte del mètode de clonació crea una còpia superficial de l’objecte origen, vol dir que es crea una nova instància de tipus Object, copia tots els camps a una nova instància i retorna un nou objecte de tipus ‘Objecte’. Aquest objecte ha de ser explícitament tipificat en el tipus d’objecte objecte font.

Aquest objecte tindrà una còpia exacta de tots els camps de l'objecte font, incloses les referències d'objecte i tipus primitiu. Si l'objecte origen conté referències a altres objectes del camp, a la nova instància només hi haurà referències a aquests objectes, no es crea una còpia d'aquests objectes. Això significa que si fem canvis en una còpia poc profunda, els canvis es reflectiran a l'objecte font. Ambdues instàncies no són independents.

El mètode clon de la classe Object està protegit per naturalesa, de manera que no totes les classes poden utilitzar el mètode clone (). Cal implementar la interfície clonable i anul·lar el mètode de clonació. Si la interfície Cloneable no està implementada, obtindreu CloneNotSupportedException.super.clone () retornarà còpia poc profunda segons la implementació a la classe Object.



Codi per a còpia 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 = grade this.designation = designation}} class Empleats per a empleats Clonable {int id Nom de la cadena Departament del departament públic Empleat (int id, Nom de la cadena, departament del departament) {this.id = id this.name = nom this.dept = dept} // Versió per defecte del mètode clone (). Crea una còpia superficial d'un objecte. Objecte protegit clon () llença CloneNotSupportedException {return super.clone ()}} classe pública ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1', 'A', 'AVP') Employee emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Creació d'un clon d'emp1 i assignació a emp2 emp2 = (Empleat) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Impressió de la designació de 'emp1' System.out.println (emp1.dept.designation) // Sortida: AVP // Canvi de la designació de 'emp2' emp2.dept.designation = 'Director' // Aquest canvi es reflectirà a System.out.println (emp1.dept.designation) original dels empleats // Empresa: Director}}

Sortida:

Output-Shallow-Copy

A l'exemple anterior, tenim una classe d'empleat emp1 que té tres variables de classe id (int), nom (cadena) i departament (departament).

def __init__ en python

Ara vam clonar emp1 a emp2 per crear una còpia poc profunda, després vam canviar la designació mitjançant l'objecte emp2 i vam comprovar que els mateixos canvis també es reflectien a emp1.


Còpia profunda

La còpia profunda d’un objecte tindrà una còpia exacta de tots els camps de l’objecte font, com una còpia poc profunda, però a diferència de la còpia minúscula si l’objecte font té alguna referència a l’objecte com a camps, es crea una rèplica de l’objecte trucant a clonar mètode. Això significa que tant els objectes origen com els de destinació són independents els uns dels altres. Qualsevol canvi realitzat a l'objecte clonat no afectarà l'objecte d'origen.

Codi per a la còpia en profunditat

diferències entre html i xml
package com.test class Department implementa Clonable {String empId String grade Designació de la cadena public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // Versió predeterminada del clon () mètode. Objecte protegit clon () llença CloneNotSupportedException {retorna super.clone ()}} classe Empleat per a empleats Clonable {int id Nom de la cadena Departament del departament públic Empleat (int id, nom de la cadena, departament del departament) {this.id = id this.name = name this.dept = dept} // Mètode Overriding clone () per crear una còpia profunda d'un objecte. Objecte protegit clon () llença CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} classe pública DeepCopyInJava {public static void main (String [] args) { Departament departament = departament nou ('1', 'A', 'AVP') Empleat emp1 = empleat nou (111, 'John', departament1) Empleat emp2 = prova nul·la // Creació d'un clon d'emp1 i assignació a emp2 emp2 = (Empleat) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Impressió de la designació de 'emp1' System.out.println (emp1.dept.designation) // Sortida: AVP / / Canvi de la designació de 'emp2' emp2.dept.designation = 'Director' // Aquest canvi es reflectirà a l'empleat original 'emp1' System.out.println (emp1.dept.designation) // Sortida: AVP}}

Sortida:

A l'exemple anterior de còpia profunda, a diferència de la còpia poc profunda, tant els objectes origen com els de destinació són independents els uns dels altres. Qualsevol canvi realitzat a emp2 no afectarà emp1.

Diferència entre la còpia superficial i la còpia profunda

Còpia poc profunda Còpia profunda
L'objecte clonat i l'objecte font no estan completament disjuntsEls objectes clonats i els objectes font són completament independents entre si.
Els canvis fets a la instància clonada afectaran la variable de referència de l'objecte fontEls canvis fets a la instància clonada no afectaran la variable de referència de l'objecte origen.
La versió predeterminada del clon és la còpia poc profundaPer crear una còpia profunda hem d’anul·lar el mètode clon de la classe Object.
Es prefereix la còpia poc profunda si les variables de classe de l'objecte només són de tipus primitiu com a campsEs prefereix una còpia profunda si les variables de classe de l’objecte tenen referències a altres objectes com a camps.
És relativament ràpidÉs relativament lent.

Amb això, arribem al final de l’article Shallow Copy i Deep Copy. Espero que entengueu les diferents diferències entre tots dos.

Consulteu el per Edureka, una empresa d'aprenentatge en línia de confiança amb una xarxa de més de 250.000 estudiants satisfets repartits per tot el món. El curs de formació i certificació de Java J2EE i SOA d’Edureka està dissenyat per a estudiants i professionals que vulguin ser desenvolupador de Java.

Tens alguna pregunta? Si us plau, mencioneu-lo a la secció de comentaris d’aquest bloc “Còpia superficial i còpia profunda” i us respondrem el més aviat possible.