Come implementare Shallow Copy e Deep Copy in Java



Questo articolo ti fornirà una conoscenza dettagliata e completa di Shallow Copy e Deep Copy in Java con esempi.

La clonazione è un processo di creazione di una replica o di una copia di oggetto, metodo clone Java.lang.Object viene utilizzato per creare una copia o una replica di un oggetto. Gli oggetti java che implementano l'interfaccia clonabile possono utilizzare il metodo clone. In questo articolo, discuteremo la copia superficiale e la copia profonda nel seguente ordine:

Creazione di una copia dell'oggetto Java

Possiamo creare una replica o una copia dell'oggetto java tramite





1. Creazione di una copia dell'oggetto in una diversa posizione di memoria. Questa è chiamata Deep copy.

2. Creazione di un nuovo riferimento che punti alla stessa posizione di memoria. Questa è anche chiamata copia superficiale.



Copia superficiale

L'implementazione predefinita del metodo clone crea una copia superficiale dell'oggetto sorgente, significa che viene creata una nuova istanza di tipo Object, copia tutti i campi in una nuova istanza e restituisce un nuovo oggetto di tipo 'Object'. Questo oggetto necessita esplicitamente di essere typecast nel tipo di oggetto dell'oggetto sorgente.

esempio di spazio dei nomi c ++

Questo oggetto avrà una copia esatta di tutti i campi dell'oggetto sorgente incluso il tipo primitivo e i riferimenti all'oggetto. Se l'oggetto di origine contiene riferimenti ad altri oggetti nel campo, nella nuova istanza saranno presenti solo riferimenti a tali oggetti, non viene creata una copia di tali oggetti. Ciò significa che se apportiamo modifiche nella copia superficiale, le modifiche verranno riflesse nell'oggetto di origine. Entrambe le istanze non sono indipendenti.

Il metodo clone nella classe Object è protetto in natura, quindi non tutte le classi possono utilizzare il metodo clone (). È necessario implementare l'interfaccia clonabile e sovrascrivere il metodo clone. Se l'interfaccia Cloneable non è implementata, si otterrà CloneNotSupportedException.super.clone () restituirà una copia superficiale come da implementazione nella classe Object.



Codice per copia superficiale

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 Employee implements Cloneable {int id Nome stringa Department dept public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Versione predefinita del metodo clone (). Crea una copia superficiale di un oggetto. protected Object clone () genera CloneNotSupportedException {return super.clone ()}} public class 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 {// Creare un clone di emp1 e assegnarlo a emp2 emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Stampa la designazione di 'emp1' System.out.println (emp1.dept.designation) // Output: AVP // Modifica della designazione di 'emp2' emp2.dept.designation = 'Director' // Questa modifica si rifletterà nell'originale Employee 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

Produzione:

Output-Shallow-Copy

algoritmo di ricerca binaria in java

Nell'esempio precedente, abbiamo una classe Employee emp1 che ha tre variabili di classe id (int), name (String) e department (Department).

Ora abbiamo clonato emp1 in emp2 per creare una copia superficiale, dopodiché abbiamo cambiato la designazione utilizzando l'oggetto emp2 e verificato che le stesse modifiche si riflettessero anche in emp1.


Copia profonda

La copia profonda di un oggetto avrà una copia esatta di tutti i campi dell'oggetto di origine come una copia superficiale, ma a differenza della copia giallastra se l'oggetto di origine ha qualsiasi riferimento all'oggetto come campi, viene creata una replica dell'oggetto chiamando clone metodo. Ciò significa che entrambi gli oggetti di origine e di destinazione sono indipendenti l'uno dall'altro. Qualsiasi modifica apportata all'oggetto clonato non avrà alcun impatto sull'oggetto di origine.

Codice per Deep Copy

package com.test class Department implementa Cloneable {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // Versione predefinita del clone () metodo. Protetto Object clone () lancia CloneNotSupportedException {return super.clone ()}} class Employee implementa Cloneable {int id String name Department dept public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Override del metodo clone () per creare una copia completa di un oggetto. protected Object clone () genera CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} public class DeepCopyInJava {public static void main (String [] args) { Department dept1 = new Department ('1', 'A', 'AVP') Employee emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Creazione di un clone di emp1 e assegnazione a emp2 emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Stampa la designazione di 'emp1' System.out.println (emp1.dept.designation) // Output: AVP / / Modifica della designazione di 'emp2' emp2.dept.designation = 'Director' // Questa modifica si rifletterà nell'originale Employee 'emp1' System.out.println (emp1.dept.designation) // Output: AVP}}

Produzione:

Nell'esempio precedente di Copia profonda, a differenza della copia superficiale, entrambi gli oggetti di origine e di destinazione sono indipendenti l'uno dall'altro. Qualsiasi modifica effettuata in emp2 non avrà alcun impatto su emp1.

Differenza tra copia superficiale e copia profonda

Copia superficiale Copia profonda
L'oggetto clonato e l'oggetto di origine non sono completamente disgiuntiGli oggetti clonati e gli oggetti sorgente sono completamente indipendenti l'uno dall'altro.
Le modifiche apportate nell'istanza clonata avranno effetto sulla variabile di riferimento dell'oggetto di origineLe modifiche apportate nell'istanza clonata non influiranno sulla variabile di riferimento dell'oggetto di origine.
La versione predefinita del clone è la copia superficialePer creare una copia completa, dobbiamo sovrascrivere il metodo clone della classe Object.
La copia superficiale è preferita se le variabili di classe dell'oggetto sono solo di tipo primitivo come campiÈ preferibile una copia completa se le variabili di classe dell'oggetto hanno riferimenti ad altri oggetti come campi.
È relativamente veloceÈ relativamente lento.

Con questo, arriviamo alla fine dell'articolo Shallow Copy e Deep Copy. Spero che tu abbia capito le varie differenze tra i due.

differenza tra lanci e lanci in java

Controlla il da Edureka, una società di formazione online affidabile con una rete di oltre 250.000 studenti soddisfatti sparsi in tutto il mondo. Il corso di formazione e certificazione Java J2EE e SOA di Edureka è progettato per studenti e professionisti che desiderano diventare sviluppatori Java.

Hai domande per noi? Per favore, menzionalo nella sezione commenti di questo blog 'Shallow Copy and Deep Copy' e ti risponderemo il prima possibile.