Ako implementovať plytkú a hlbokú kópiu v Jave



Tento článok vám poskytne podrobné a komplexné znalosti funkcií Shallow Copy a Deep Copy v Jave s príkladmi.

Klonovanie je proces vytvárania repliky alebo kópie produktu metóda objektu, klon Java.lang.Object sa používa na vytvorenie kópie alebo repliky objektu. java objekty, ktoré implementujú Cloneable interface, sú spôsobilé na použitie metódy klonovania. V tomto článku budeme diskutovať o plytkej a hlbokej kópii v nasledujúcom poradí:

Vytváranie kópie objektu Java

Môžeme vytvoriť repliku alebo kópiu java objektu pomocou





1. Vytvorenie kópie objektu na inom pamäťovom mieste. Toto sa nazýva hlboká kópia.

čo je __init__

2. Vytvorenie nového odkazu, ktorý ukazuje na rovnaké miesto v pamäti. Toto sa tiež nazýva plytká kópia.



Plytké kopírovanie

Predvolená implementácia metódy klonovania vytvorí plytkú kópiu zdrojového objektu, to znamená, že sa vytvorí nová inštancia typu Object, skopíruje všetky polia do novej inštancie a vráti nový objekt typu ‘Object’. Tento objekt musí byť explicitne obsadený v type objektu zdrojového objektu.

Tento objekt bude mať presnú kópiu všetkých polí zdrojového objektu vrátane primitívneho typu a odkazov na objekty. Ak zdrojový objekt obsahuje akékoľvek odkazy na iné objekty v poli, v novej inštancii bude mať iba odkazy na tieto objekty, kópia týchto objektov sa nevytvorí. To znamená, že ak urobíme zmeny v plytkej kópii, zmeny sa prejavia v zdrojovom objekte. Oba prípady nie sú nezávislé.

Metóda clone v triede Object je chránená v prírode, takže nie všetky triedy môžu používať metódu clone (). Musíte implementovať Cloneable interface a prepísať metódu klonovania. Ak rozhranie Cloneable nie je implementované, dostanete príkaz CloneNotSupportedException.super.clone (), ktorý vráti plytkú kópiu podľa implementácie v triede Object.



Kód pre plytké kopírovanie

balíček com.test trieda Oddelenie {String empId String grade Označenie reťazca public Department (String empId, String grade, String označení) {this.empId = empId this.grade = grade this.designation = označení}} trieda Zamestnanec implementuje Cloneable {int id Názov reťazca Oddelenie oddelenia verejné Zamestnanec (int id, Názov reťazca, Oddelenie oddelenia) {this.id = id this.name = name this.dept = dept} // Predvolená verzia metódy clone (). Vytvára plytkú kópiu 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 = nový zamestnanec (111, 'John', dept1) zamestnanec emp2 = nulový pokus {// Vytvorenie klonu emp1 a jeho priradenie k emp2 emp2 = (zamestnanec) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Tlač označenia „emp1“ System.out.println (emp1.dept.designation) // Výstup: AVP // Zmena označenia „emp2“ emp2.dept.designation = „Director“ // Táto zmena sa prejaví v pôvodnom systéme Employee 'emp1' System.out.println (emp1.dept.designation) // Výstup: Director}}

Výkon:

Output-Shallow-Copy

ako klonovať objekt v

Vo vyššie uvedenom príklade máme triedu Emp1 zamestnanca, ktorá má tri premenné triedy id (int), name (String) a department (Department).

Teraz sme naklonovali emp1 na emp2, aby sme vytvorili plytkú kópiu, potom sme zmenili označenie pomocou objektu emp2 a overili, že rovnaké zmeny sa prejavili aj v emp1.


Deep Copy

Hlboká kópia objektu bude mať presnú kópiu všetkých polí zdrojového objektu ako plytkú kópiu, ale na rozdiel od bledej kópie, ak má zdrojový objekt nejaký odkaz na objekt ako polia, potom sa replika objektu vytvorí volaním klonu metóda. To znamená, že zdrojové aj cieľové objekty sú navzájom nezávislé. Akákoľvek zmena vykonaná v klonovanom objekte nebude mať vplyv na zdrojový objekt.

Kód pre hlbokú kópiu

balíček com.test trieda Oddelenie implementuje Cloneable {String empId String grade Označenie reťazca public Department (String empId, String grade, String označení) {this.empId = empId this.grade = grade this.designation = označení} // Predvolená verzia klonu () metóda. chránený objekt clone () hodí CloneNotSupportedException {return super.clone ()}} trieda Zamestnanec implementuje Cloneable {int id Názov reťazca Oddelenie odd. verejné Zamestnanec (int id, Názov reťazca, Oddelenie oddelenia) {this.id = id this.name = meno this.dept = odd}} // Prepísanie metódy clone () na vytvorenie hĺbkovej kópie 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) { Oddelenie dept1 = nové Oddelenie ('1', 'A', 'AVP') Zamestnanec emp1 = nový Zamestnanec (111, 'John', dept1) Zamestnanec emp2 = nulový pokus {// Vytvorenie klonu emp1 a jeho priradenie k emp2 emp2 = (Zamestnanec) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Tlač označenia „emp1“ System.out.println (emp1.dept.designation) // Výstup: AVP / / Zmena označenia 'emp2' emp2.dept.designation = 'Director' // Táto zmena sa prejaví v pôvodnom Employee 'emp1' System.out.println (emp1.dept.designation) // Výstup: AVP}}

Výkon:

Vo vyššie uvedenom príklade hlbokej kópie sú na rozdiel od plytkej kópie zdrojové aj cieľové objekty navzájom nezávislé. Akákoľvek zmena vykonaná v emp2 nebude mať vplyv na emp1.

Rozdiel medzi plytkou a hlbokou kópiou

Plytké kopírovanie Deep Copy
Klonovaný objekt a zdrojový objekt nie sú úplne disjunktnéKlonované objekty a zdrojové objekty sú navzájom úplne nezávislé.
Zmeny vykonané v klonovanej inštancii ovplyvnia referenčnú premennú zdrojového objektuZmeny vykonané v klonovanej inštancii nebudú mať vplyv na referenčnú premennú zdrojového objektu.
Predvolená verzia klonu je plytká kópiaAby sme vytvorili hlbokú kópiu, musíme prepísať metódu klonovania triedy Object.
Plytká kópia sa uprednostňuje, ak sú premenné triedy objektu iba primitívnym typom ako poliaHlboká kópia sa uprednostňuje, ak majú premenné triedy objektu odkazy na iné objekty ako polia.
Je to pomerne rýchleJe to pomerne pomalé.

Týmto sa dostávame na koniec článku Shallow Copy a Deep Copy. Dúfam, že ste pochopili rôzne rozdiely medzi nimi.

cloudera certifikovaný administrátor pre apache hadoop

Pozrite sa na autor: Edureka, dôveryhodná online vzdelávacia spoločnosť so sieťou viac ako 250 000 spokojných študentov rozmiestnených po celom svete. Výcvikový a certifikačný kurz Edureka Java J2EE a SOA je určený pre študentov a profesionálov, ktorí chcú byť vývojármi Java.

Máte na nás otázku? Uveďte to, prosím, v sekcii komentárov tohto blogu „Shallow Copy and Deep Copy“ a my sa vám ozveme čo najskôr.