Как да внедрим плитко копиране и дълбоко копиране в Java



Тази статия ще ви предостави подробни и изчерпателни познания за плитко копиране и дълбоко копиране в Java с примери.

Клонирането е процес на създаване на реплика или копие на обект, метод на клониране Java.lang.Object се използва за създаване на копие или реплика на обект. java обектите, които реализират Cloneable интерфейс, отговарят на условията за използване на метода на клониране. В тази статия ще обсъдим Shallow Copy и Deep Copy в следния ред:

Създаване на копие на Java обект

Можем да създадем реплика или копие на Java обект от





1. Създаване на копие на обект на различно място в паметта. Това се нарича дълбоко копие.

2. Създаване на нова препратка, която сочи към същото място в паметта. Това също се нарича плитко копие.



как да използвам подниза в java -

Плитко копие

Изпълнението по подразбиране на метода на клонинг създава плитко копие на обекта-източник, това означава, че се създава нов екземпляр от тип Обект, той копира всички полета в нов екземпляр и връща нов обект от тип ‘Object’. Този обект изрично трябва да бъде typecast в тип обект на изходен обект.

Този обект ще има точно копие на всички полета на обекта източник, включително примитивния тип и препратките към обекта. Ако обектът източник съдържа препратки към други обекти в полето, тогава в новия екземпляр ще има само препратки към тези обекти, копие на тези обекти не се създава. Това означава, че ако направим промени в плитко копие, промените ще се отразят в обекта източник. И двата случая не са независими.

Методът clone в клас Object е защитен в природата, така че не всички класове могат да използват метода clone (). Трябва да приложите Cloneable интерфейс и да замените метода на клониране. Ако интерфейсът Cloneable не е реализиран, ще получите CloneNotSupportedException.super.clone () ще върне плитко копие според изпълнението в клас Object.



Код за плитко копиране

пакет com.test class Department {String empId String grade Обозначение на низа public Department (String empId, String grade, String odredса) {this.empId = empId this.grade = grade this.designation = designation}} клас Служителят изпълнява Cloneable {int id Име на низ Отдел Отдел публичен служител (int id, Име на низ, Отдел отдел) {this.id = id this.name = name this.dept = dept} // Метод по подразбиране на clone (). Създава плитко копие на обект. защитен обект clone () хвърля CloneNotSupportedException {return super.clone ()}} публичен клас ShallowCopyInJava {public static void main (String [] args) {Department dept1 = new Department ('1', 'A', 'AVP') Служител emp1 = нов служител (111, 'John', dept1) Служител emp2 = null try {// Създаване на клонинг на emp1 и присвояването му на emp2 emp2 = (Служител) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Отпечатване на обозначението на 'emp1' System.out.println (emp1.dept.designation) // Изход: AVP // Промяна на обозначението на 'emp2' emp2.dept.designation = 'Director' // Тази промяна ще бъде отразена в оригиналния служител 'emp1' System.out.println (emp1.dept.designation) // Резултат: директор}}

Изход:

Output-Shallow-Copy

как да използвам семафори в java -

В горния пример имаме клас на служител emp1, който има три класа променлива id (int), име (низ) и отдел (отдел).

Сега клонирахме emp1 към emp2, за да създадем плитко копие, след което сменихме обозначението с помощта на обект emp2 и проверихме, че същите промени са отразени и в emp1.


Дълбоко копиране

Дълбокото копие на обект ще има точно копие на всички полета на обекта-източник като плитко копие, но за разлика от копие, когато обектът-източник има някаква препратка към обекта като полета, тогава се създава реплика на обекта чрез извикване на клонинг метод. Това означава, че обектите източник и дестинация са независими един от друг. Всяка промяна, направена в клонирания обект, няма да повлияе на обекта източник.

Код за дълбоко копиране

пакет com.test class Department реализира Cloneable {String empId String grade String Oznaka public public Department (String empId, String grade, String odredса) {this.empId = empId this.grade = grade this.designation = designation} // Версия по подразбиране на клонинг () метод. защитен обект клонинг () хвърля CloneNotSupportedException {return super.clone ()}} клас Служител изпълнява Cloneable {int id Име на низа Отделен публичен служител (int id, String name, Department dept) {this.id = id this.name = name this.dept = dept} // Замяна на метода clone () за създаване на дълбоко копие на обект. защитен обект clone () хвърля CloneNotSupportedException {Служител emp = (Служител) super.clone () emp.dept = (Department) dept.clone () return emp}} публичен клас DeepCopyInJava {public static void main (String [] args) { Отдел dept1 = нов отдел ('1', 'A', 'AVP') Служител emp1 = нов служител (111, 'John', dept1) Служител emp2 = null try {// Създаване на клонинг на emp1 и присвояването му на emp2 emp2 = (Служител) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Отпечатване на обозначението на 'emp1' System.out.println (emp1.dept.designation) // Изход: AVP / / Промяна на обозначението на 'emp2' emp2.dept.designation = 'Director' // Тази промяна ще бъде отразена в оригиналния служител 'emp1' System.out.println (emp1.dept.designation) // Изход: AVP}}

Изход:

В горния пример за дълбоко копиране, за разлика от плиткото копие, обектите източник и местоназначение са независими един от друг. Всяка промяна, направена в emp2, няма да повлияе на emp1.

Разлика между плитко копиране и дълбоко копиране

Плитко копие Дълбоко копиране
Клонираният обект и обектът източник не се разделят напълноКлонираните обекти и източниците са напълно независими един от друг.
Промените, направени в клонирания екземпляр, ще повлияят на референтната променлива на изходния обектПромените, направени в клонирания екземпляр, няма да повлияят на референтната променлива на изходния обект.
Версията по подразбиране на клонинга е плиткото копиеЗа да създадем дълбоко копие, трябва да заменим метода на клониране от клас Object.
Предпочита се плитко копиране, ако променливите на класа на обекта са само примитивен тип като полетаДълбоко копие се предпочита, ако променливите на класа на обекта имат препратки към други обекти като полета.
Това е относително бързоТова е относително бавно.

С това стигаме до края на статията за плитко копиране и дълбоко копиране. Надявам се, че сте разбрали различните разлики между двете.

разлика между окончателно окончателно и финализиране в java

Вижте от Edureka, доверена компания за онлайн обучение с мрежа от над 250 000 доволни учащи, разпространени по целия свят. Курсът за обучение и сертифициране на Java J2EE и SOA на Edureka е предназначен за студенти и професионалисти, които искат да бъдат Java Developer.

Имате въпрос към нас? Моля, споменете го в раздела за коментари на този блог „Shallow Copy and Deep Copy“ и ние ще се свържем с вас възможно най-скоро.