Jak implementovat mělkou a hlubokou kopii v Javě

Tento článek vám poskytne podrobné a komplexní znalosti funkcí Shallow Copy a Deep Copy v Javě s příklady.

Klonování je proces vytváření repliky nebo kopie metoda objektu, klon Java.lang.Object se používá k vytvoření kopie nebo repliky objektu. java objekty, které implementují Cloneable rozhraní, jsou způsobilé pro použití metody klonování. V tomto článku probereme mělkou kopii a hlubokou kopii v následujícím pořadí:

Vytvoření kopie objektu Java

Můžeme vytvořit repliku nebo kopii java objektu





1. Vytvoření kopie objektu v jiném paměťovém umístění. Tomu se říká hluboká kopie.

jak používat anakondu pro python

2. Vytvoření nové reference, která ukazuje na stejné místo v paměti. Tomu se také říká mělká kopie.



Mělká kopie

Výchozí implementace metody klon vytváří mělkou kopii zdrojového objektu, to znamená, že je vytvořena nová instance typu Object, zkopíruje všechna pole do nové instance a vrátí nový objekt typu ‚Object '. This Object explicitly needs to be typecast in object type of source object.

Tento objekt bude mít přesnou kopii všech polí zdrojového objektu, včetně primitivního typu a odkazů na objekty. Pokud zdrojový objekt obsahuje nějaké odkazy na jiné objekty v poli, bude v nové instanci mít pouze odkazy na tyto objekty, kopie těchto objektů se nevytvoří. To znamená, že pokud provedeme změny v mělké kopii, změny se projeví ve zdrojovém objektu. Oba případy nejsou nezávislé.

Metoda clone ve třídě Object je chráněna v přírodě, takže ne všechny třídy mohou použít metodu clone (). Musíte implementovat rozhraní Cloneable a přepsat metodu klonování. Pokud rozhraní Cloneable není implementováno, dostanete CloneNotSupportedException.super.clone () vrátí mělkou kopii podle implementace ve třídě Object.



Kód pro mělkou kopii

balíček com.test třída Oddělení {Řetězec empId Řetězec hodnocení Řetězcové označení veřejné oddělení (Řetězec empId, Řetězcový stupeň, Řetězcové označení) {this.empId = empId this.grade = stupeň this.designation = označení}} třída Zaměstnanec implementuje Cloneable {int id Název řetězce Oddělení oddělení veřejné Zaměstnanec (int id, Název řetězce, Oddělení oddělení) {this.id = id this.name = name this.dept = dept} // Výchozí verze metody clone (). Vytvoří mělkou kopii objektu. protected Object clone () throws 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 {// Create a clone of emp1 and assigning it to emp2 emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Tisk označení 'emp1' System.out.println (emp1.dept.designation) // Výstup: AVP // Změna označení 'emp2' emp2.dept.designation = 'Director' // Tato změna se projeví v původním systému Employee 'emp1' System.out.println (emp1.dept.designation) // Výstup: Director}}

Výstup:

Output-Shallow-Copy

třída skeneru v příkladech Java

Ve výše uvedeném příkladu máme třídu Emp1 emp1, která má tři proměnné třídy id (int), name (String) a department (Department).

Nyní jsme klonovali emp1 na emp2, abychom vytvořili mělkou kopii, poté jsme změnili označení pomocí objektu emp2 a ověřili, že se stejné změny projevily také v emp1.


Deep Copy

Hluboká kopie objektu bude mít přesnou kopii všech polí zdrojového objektu, jako je mělká kopie, ale na rozdíl od bledé kopie, pokud má zdrojový objekt jakýkoli odkaz na objekt jako pole, vytvoří se replika objektu voláním klonu metoda. To znamená, že zdrojové i cílové objekty jsou na sobě nezávislé. Jakákoli změna provedená v klonovaném objektu nebude mít vliv na zdrojový objekt.

Kód pro hlubokou kopii

balíček com.test třída Oddělení implementuje Cloneable {String empId String grade Řetězcové označení public Department (String empId, String grade, String označení) {this.empId = empId this.grade = grad this.designation = označení} // Výchozí verze klonu () metoda. chráněný objekt clone () hodí CloneNotSupportedException {návrat super.clone ()}} třída Zaměstnanec implementuje Cloneable {int id Název řetězce Oddělení oddělení veřejné Zaměstnanec (int id, Název řetězce, Oddělení oddělení) {this.id = id this.name = name this.dept = dept} // Přepsání metody clone () k vytvoření hluboké kopie objektu. protected Object clone () throws 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 {// Create a clone of emp1 and assigning it to emp2 emp2 = (Zaměstnanec) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Tisk označení 'emp1' System.out.println (emp1.dept.designation) // Výstup: AVP / / Změna označení 'emp2' emp2.dept.designation = 'Director' // Tato změna se projeví v původním Employee 'emp1' System.out.println (emp1.dept.designation) // Výstup: AVP}}

Výstup:

Ve výše uvedeném příkladu Deep copy, na rozdíl od mělké kopie, jsou zdrojové i cílové objekty na sobě nezávislé. Jakákoli změna provedená v emp2 nebude mít vliv na emp1.

Rozdíl mezi mělkou a hlubokou kopií

Mělká kopie Deep Copy
Klonovaný objekt a zdrojový objekt nejsou zcela disjunktníKlonované objekty a zdrojové objekty jsou na sobě zcela nezávislé.
Změny provedené v klonované instanci ovlivní referenční proměnnou zdrojového objektuZměny provedené v klonované instanci nebudou mít vliv na referenční proměnnou zdrojového objektu.
Výchozí verze klonu je mělká kopieChcete-li vytvořit hlubokou kopii, musíme přepsat metodu klonování třídy Object.
Mělká kopie je preferována, pokud jsou proměnné třídy objektu pouze primitivní typ jako poleHluboká kopie je preferována, pokud mají proměnné třídy objektu odkazy na jiné objekty jako pole.
Je to relativně rychléJe to relativně pomalé.

S tímto se dostáváme na konec článku Shallow Copy a Deep Copy. Doufám, že jste pochopili různé rozdíly mezi nimi.

výuka serveru SQL pro začátečníky s příklady

Podívejte se na Edureka, důvěryhodná online vzdělávací společnost se sítí více než 250 000 spokojených studentů po celém světě. Školicí a certifikační kurz Edureka Java J2EE a SOA je určen pro studenty a profesionály, kteří chtějí být vývojářem Java.

Máte na nás dotaz? Uveďte to prosím v sekci komentářů v tomto blogu „Shallow Copy and Deep Copy“ a my se vám ozveme co nejdříve.