Hur man implementerar grund kopiering och djup kopiering i Java



Den här artikeln ger dig en detaljerad och omfattande kunskap om Shallow Copy och Deep Copy i Java med exempel.

Kloning är en process för att skapa en kopia eller kopia av objekt, klonmetod Java.lang.Object används för att skapa kopia eller replik av ett objekt. java-objekt som implementerar Cloneable-gränssnitt är berättigade att använda klonmetoden. I den här artikeln kommer vi att diskutera Shallow Copy och Deep Copy i följande ordning:

vad kan serieras i Java

Skapa kopia av Java-objekt

Vi kan skapa en kopia eller kopia av java-objekt av





1. Skapa en kopia av objektet på en annan minnesplats. Detta kallas en djup kopia.

2. Skapa en ny referens som pekar på samma minnesplats. Detta kallas också en grunt kopia.



Grunt kopia

Standardimplementeringen av klonmetoden skapar en grunt kopia av källobjektet, det betyder att en ny instans av typen Objekt skapas, den kopierar alla fälten till en ny instans och returnerar ett nytt objekt av typen 'Objekt'. Detta objekt måste uttryckligen skrivas i källobjektets objekttyp.

Detta objekt kommer att ha en exakt kopia av alla källobjektfält inklusive primitiv typ och objektreferenser. Om källobjektet innehåller några referenser till andra objekt i fältet kommer i den nya instansen bara att ha referenser till dessa objekt, en kopia av dessa objekt skapas inte. Det betyder att om vi gör ändringar i grunt kopia kommer ändringar att återspeglas i källobjektet. Båda instanserna är inte oberoende.

Klonmetoden i Objektklass är skyddad till sin natur, så inte alla klasser kan använda klonmetoden (). Du måste implementera Cloneable interface och åsidosätta klonmetoden. Om det klonabla gränssnittet inte är implementerat får du CloneNotSupportedException.super.clone () returnerar grunt kopia enligt implementeringen i objektklass.



Kod för grunt kopia

paket com.test klass Avdelning {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation}} class Anställd implementerar Cloneable {int id Strängnamn Avdelningsavdelning offentlig anställd (int id, Strängnamn, avdelningsavdelning) {this.id = id this.name = namn detta.dept = avdelning} // Standardversion av metoden clone (). Det skapar grunt kopia av ett objekt. skyddad objektklon () kastar CloneNotSupportedException {return super.clone ()}} offentlig klass ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1', 'A', 'AVP') Anställd emp1 = ny anställd (111, 'John', avd. 1) Anställd emp2 = null försök {// Skapa en klon av emp1 och tilldela den till emp2 emp2 = (anställd) emp1.clone ()} fånga (CloneNotSupportedException e) {e. printStackTrace ()} // Skriva ut beteckningen för 'emp1' System.out.println (emp1.dept.designation) // Output: AVP // Ändra beteckningen för 'emp2' emp2.dept.designation = 'Director' // Denna ändring kommer att återspeglas i den ursprungliga 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

Produktion:

Output-Shallow-Copy

I exemplet ovan har vi en anställd klass emp1 som har tre klassvariabler id (int), namn (sträng) och avdelning (avdelning).

Vi klonade nu emp1 till emp2 för att skapa en grunt kopia, efter det ändrade vi beteckningen med emp2-objekt och verifierade att samma förändringar återspeglades också i emp1.


Djup kopia

Den djupa kopian av ett objekt kommer att ha en exakt kopia av alla källobjektens fält som en grunt kopia, men till skillnad från sallow copy om källobjektet har någon referens till objektet som fält, skapas en replik av objektet genom att ringa klon metod. Detta innebär att både käll- och destinationsobjekt är oberoende av varandra. Alla ändringar som görs i det klonade objektet påverkar inte källobjektet.

Kod för djup kopia

hur man deklarerar en instansvariabel i java
paketet com.test klass Avdelningen implementerar klonbar {String empId String grade String designation Public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // Standardversion av klon () metod. skyddad objektklon () kastar CloneNotSupportedException {return super.clone ()}} klass Anställd implementerar Cloneable {int id Strängnamn Avdelningsavdelning offentlig Anställd (int id, Strängnamn, Avdelningsavdelning) {this.id = id this.name = name this.dept = dept} // Overriding clone () -metoden för att skapa en djup kopia av ett objekt. skyddad objektklon () kastar CloneNotSupportedException {anställd emp = (anställd) super.clone () emp.dept = (avdelning) dept.clone () returnera emp}} offentlig klass DeepCopyInJava {offentlig statisk tomrum huvud (String [] args) { Avdelning dept1 = ny avdelning ('1', 'A', 'AVP') Anställd emp1 = ny anställd (111, 'John', dept1) Anställd emp2 = null försök {// Skapa en klon av emp1 och tilldela den till emp2 emp2 = (Anställd) emp1.clone ()} fångst (CloneNotSupportedException e) {e.printStackTrace ()} // Utskrift av beteckningen 'emp1' System.out.println (emp1.dept.designation) // Output: AVP / / Ändra beteckningen för 'emp2' emp2.dept.designation = 'Director' // Denna ändring kommer att återspeglas i original Anställd 'emp1' System.out.println (emp1.dept.designation) // Output: AVP}}

Produktion:

I ovanstående exempel på djup kopia, till skillnad från grund kopia, är både käll- och destinationsobjekt oberoende av varandra. Alla ändringar som görs i emp2 påverkar inte emp1.

Skillnaden mellan grunt och djupt

Grunt kopia Djup kopia
Klonade objekt och källobjekt är inte helt sammanhängandeKlonade föremål och källobjekt är helt oberoende av varandra.
Ändringar som görs i den klonade instansen påverkar källobjektets referensvariabelÄndringar som görs i den klonade instansen påverkar inte källobjektets referensvariabel.
Standardversionen av klonen är den grunda kopianFör att skapa djup kopia måste vi åsidosätta klonmetoden för objektklass.
Grunn kopia föredras om klassvariablerna för objektet endast är primitiva som fältEn djupkopia föredras om objektets klassvariabler har referenser till andra objekt som fält.
Det är relativt snabbtDet är relativt långsamt.

Med detta kommer vi till slutet av artikeln Shallow Copy och Deep Copy. Jag hoppas att du fick förståelse för de olika skillnaderna mellan de två.

Kolla in av Edureka, ett pålitligt inlärningsföretag online med ett nätverk av mer än 250 000 nöjda elever spridda över hela världen. Edurekas Java J2EE- och SOA-utbildning och certifieringskurs är utformad för studenter och yrkesverksamma som vill vara Java-utvecklare.

Har du en fråga till oss? Vänligen nämna det i kommentarsektionen på denna 'Shallow Copy and Deep Copy' -blogg så återkommer vi så snart som möjligt.