Jak zaimplementować Shallow Copy i Deep Copy w Javie



W tym artykule znajdziesz szczegółową i wszechstronną wiedzę na temat płytkiego kopiowania i głębokiego kopiowania w języku Java wraz z przykładami.

Klonowanie to proces tworzenia repliki lub kopii obiekt, metoda klonowania Java.lang.Object służy do tworzenia kopii lub repliki obiektu. obiekty java, które implementują interfejs Cloneable, kwalifikują się do używania metody clone. W tym artykule omówimy Shallow Copy i Deep Copy w następującej kolejności:

Tworzenie kopii obiektu Java

Możemy stworzyć replikę lub kopię obiektu java wg





jak używać anakondy dla Pythona

1. Tworzenie kopii obiektu w innym miejscu pamięci. Nazywa się to głęboką kopią.

2. Tworzenie nowego odniesienia, które wskazuje na to samo miejsce w pamięci. Nazywa się to również kopią płytką.



Płytka kopia

Domyślna implementacja metody clone tworzy płytką kopię obiektu źródłowego, co oznacza, że ​​tworzona jest nowa instancja typu Object, kopiuje wszystkie pola do nowej instancji i zwraca nowy obiekt typu „Object”. Ten obiekt jawnie musi być rzutowany na typ w typie obiektu źródłowego.

Ten obiekt będzie miał dokładną kopię wszystkich pól obiektu źródłowego, w tym typu pierwotnego i odniesień do obiektu. Jeśli obiekt źródłowy zawiera jakiekolwiek odniesienia do innych obiektów w polu, to w nowej instancji będą miały tylko odniesienia do tych obiektów, kopia tych obiektów nie zostanie utworzona. Oznacza to, że jeśli dokonamy zmian w płytkiej kopii, zmiany zostaną odzwierciedlone w obiekcie źródłowym. Obie instancje nie są niezależne.

Metoda clone w klasie Object ma charakter chroniony, więc nie wszystkie klasy mogą używać metody clone (). Musisz zaimplementować interfejs Cloneable i zastąpić metodę clone. Jeśli interfejs Cloneable nie jest zaimplementowany, otrzymasz CloneNotSupportedException.super.clone () zwróci płytką kopię zgodnie z implementacją w klasie Object.



Kod dla płytkiej kopii

pakiet com.test class Department {String empId String grade Oznaczenie ciągu public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation}} class Pracownik implementuje Cloneable {int id Nazwa łańcucha Dział działu publiczny Pracownik (identyfikator int, nazwa ciągu, dział działu) {this.id = id this.name = name this.dept = dept} // Domyślna wersja metody clone (). Tworzy płytką kopię obiektu. protected Object clone () rzuca 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 {// Tworzenie klonu emp1 i przypisanie go do emp2 emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Drukowanie oznaczenia 'emp1' System.out.println (emp1.dept.designation) // Wyjście: AVP // Zmiana oznaczenia 'emp2' emp2.dept.designation = 'Director' // Ta zmiana zostanie odzwierciedlona w oryginalnym systemie Employee „emp1” System.out.println (emp1.dept.designation) // Output: Director}}

Wynik:

Output-Shallow-Copy

java do potęgi operatora

W powyższym przykładzie mamy klasę Employee emp1, która ma trzy zmienne klasy id (int), nazwę (String) i dział (Department).

Sklonowaliśmy teraz emp1 do emp2, aby utworzyć płytką kopię, po czym zmieniliśmy oznaczenie za pomocą obiektu emp2 i zweryfikowaliśmy, że te same zmiany zostały również odzwierciedlone w emp1.


Głęboka kopia

Głęboka kopia obiektu będzie miała dokładną kopię wszystkich pól obiektu źródłowego, taką jak płytka kopia, ale w przeciwieństwie do ziemistej kopii, jeśli obiekt źródłowy ma jakiekolwiek odniesienie do obiektu jako pól, wówczas replika obiektu jest tworzona przez wywołanie clone metoda. Oznacza to, że zarówno obiekty źródłowe, jak i docelowe są od siebie niezależne. Żadna zmiana wprowadzona w sklonowanym obiekcie nie wpłynie na obiekt źródłowy.

Kod do głębokiej kopii

pakiet com.test class Dział implementuje Cloneable {String empId String grade Oznaczenie ciągu public Department (String empId, String grade, String desygnacja) {this.empId = empId this.grade = grade this.designation = designation} // Domyślna wersja klonu () metoda. protected Object clone () rzuca CloneNotSupportedException {return super.clone ()}} class Pracownik implementuje Cloneable {int id String name Dział działu public Employee (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Przesłanianie metody clone () w celu utworzenia głębokiej kopii obiektu. protected Object clone () rzuca CloneNotSupportedException {Employee emp = (Employee) super.clone () emp.dept = (Department) dept.clone () return emp}} public class DeepCopyInJava {public static void main (String [] args) { Dział 1 = nowy Dział ('1', 'A', 'AVP') Pracownik emp1 = nowy Pracownik (111, 'John', dział1) Pracownik emp2 = null try {// Tworzenie klonu emp1 i przypisywanie go do emp2 emp2 = (Pracownik) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Drukowanie oznaczenia 'emp1' System.out.println (emp1.dept.designation) // Wyjście: AVP / / Zmiana oznaczenia 'emp2' emp2.dept.designation = 'Director' // Ta zmiana zostanie odzwierciedlona w oryginalnym systemie Pracownik 'emp1' System.out.println (emp1.dept.designation) // Wyjście: AVP}}

Wynik:

W powyższym przykładzie Deep copy, w przeciwieństwie do płytkiej kopii, zarówno obiekt źródłowy, jak i docelowy są od siebie niezależne. Żadna zmiana wprowadzona w emp2 nie wpłynie na emp1.

Różnica między płytką a głęboką kopią

Płytka kopia Głęboka kopia
Sklonowany obiekt i obiekt źródłowy nie są całkowicie rozłączneSklonowane obiekty i obiekty źródłowe są od siebie całkowicie niezależne.
Zmiany wprowadzone w sklonowanej instancji będą miały wpływ na zmienną referencyjną obiektu źródłowegoZmiany wprowadzone w sklonowanej instancji nie wpłyną na zmienną referencyjną obiektu źródłowego.
Domyślną wersją klonu jest płytka kopiaAby stworzyć głęboką kopię, musimy nadpisać metodę clone klasy Object.
Płytka kopia jest preferowana, jeśli zmienne klas obiektu są tylko polami typu pierwotnegoGłęboka kopia jest preferowana, jeśli zmienne klasy obiektu mają odniesienia do innych obiektów jako pól.
Jest stosunkowo szybkiJest stosunkowo wolny.

W ten sposób dochodzimy do końca artykułu Shallow Copy i Deep Copy. Mam nadzieję, że rozumiesz różne różnice między nimi.

jaka jest metoda tostingu w java

Sprawdź autorstwa Edureka, zaufanej firmy zajmującej się edukacją online, z siecią ponad 250 000 zadowolonych uczniów rozsianych po całym świecie. Szkolenie i certyfikacja J2EE i SOA firmy Edureka jest przeznaczony dla studentów i profesjonalistów, którzy chcą zostać programistą Java.

Masz do nas pytanie? Wspomnij o tym w sekcji komentarzy na blogu „Shallow Copy and Deep Copy”, a my skontaktujemy się z Tobą tak szybko, jak to możliwe.