Как реализовать мелкое и глубокое копирование в Java

Эта статья предоставит вам подробные и всесторонние знания о поверхностном копировании и глубоком копировании в Java с примерами.

Клонирование - это процесс создания реплики или копии объект, метод клонирования Java.lang.Object используется для создания копии или реплики объекта. java-объекты, реализующие интерфейс Cloneable, могут использовать метод clone. В этой статье мы обсудим мелкую и глубокую копии в следующем порядке:



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

Мы можем создать реплику или копию java-объекта с помощью



1. Создание копии объекта в другом месте памяти. Это называется глубокой копией.

2. Создание новой ссылки, указывающей на то же место в памяти. Это также называется мелкой копией.



Мелкая копия

Реализация метода clone по умолчанию создает неглубокую копию исходного объекта, это означает, что создается новый экземпляр типа Object, он копирует все поля в новый экземпляр и возвращает новый объект типа «Object». Этот объект явно должен быть приведен в тип объекта исходного объекта.

что такое множественное наследование в Java

Этот объект будет иметь точную копию всех полей исходного объекта, включая примитивный тип и ссылки на объекты. Если исходный объект содержит какие-либо ссылки на другие объекты в поле, тогда в новом экземпляре будут только ссылки на эти объекты, копия этих объектов не создается. Это означает, что если мы внесем изменения в неглубокую копию, то изменения будут отражены в исходном объекте. Оба случая не независимы.

Метод clone в классе Object является защищенным по своей природе, поэтому не все классы могут использовать метод clone (). Вам необходимо реализовать интерфейс Cloneable и переопределить метод клонирования. Если интерфейс Cloneable не реализован, вы получите CloneNotSupportedException. Super.clone () вернет мелкую копию в соответствии с реализацией в классе Object.



Код для неглубокой копии

package com.test class Department {String empId String grade String Обозначение public Department (String empId, String grade, String обозначение) {this.empId = empId this.grade = grade this.designation = designation}} класс Сотрудник реализует Cloneable {int id Строковое имя Департамент dept public Employee (int id, String name, Department dept) {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 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Создание клона emp1 и присвоение его emp2 emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Печать обозначения 'emp1' System.out.println (emp1.dept.designation) // Вывод: AVP // Изменение обозначения 'emp2' emp2.dept.designation = 'Director' // Это изменение будет отражено в исходном Employee 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

Вывод:

Output-Shallow-Copy

В приведенном выше примере у нас есть класс сотрудников emp1, который имеет три переменной класса: id (int), name (String) и Department (Department).

Теперь мы клонировали emp1 в emp2, чтобы создать неглубокую копию, после этого мы изменили обозначение с помощью объекта emp2 и проверили, что те же изменения отражены и в emp1.


Глубокая копия

Глубокая копия объекта будет иметь точную копию всех полей исходного объекта, как неглубокая копия, но в отличие от желтой копии, если исходный объект имеет какую-либо ссылку на объект в виде полей, то реплика объекта создается путем вызова clone метод. Это означает, что и исходный, и целевой объекты независимы друг от друга. Любые изменения, внесенные в клонированный объект, не повлияют на исходный объект.

Код для глубокой копии

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

Вывод:

В приведенном выше примере глубокой копии, в отличие от мелкой копии, как исходный, так и целевой объекты независимы друг от друга. Любые изменения, внесенные в emp2, не повлияют на emp1.

Разница между мелкой копией и глубокой копией

Мелкая копия Глубокая копия
Клонированный объект и исходный объект не пересекаются полностьюКлонированные объекты и исходные объекты полностью независимы друг от друга.
Изменения, внесенные в клонированный экземпляр, повлияют на ссылочную переменную исходного объекта.Изменения, внесенные в клонированный экземпляр, не повлияют на ссылочную переменную исходного объекта.
Версия клона по умолчанию - это мелкая копия.Чтобы создать глубокую копию, нам нужно переопределить метод clone класса Object.
Мелкая копия предпочтительна, если переменные класса объекта имеют только примитивный тип в качестве полей.Глубокая копия предпочтительна, если переменные класса объекта имеют ссылки на другие объекты в виде полей.
Это относительно быстроЭто относительно медленно.

На этом мы подошли к концу статьи Shallow Copy и Deep Copy. Надеюсь, вы поняли различные различия между ними.

Проверьте от Edureka, надежной компании по онлайн-обучению с сетью из более чем 250 000 довольных учащихся по всему миру. Курс обучения и сертификации по Java J2EE и SOA от Edureka предназначен для студентов и профессионалов, которые хотят стать Java-разработчиками.

Есть вопрос к нам? Пожалуйста, укажите это в разделе комментариев этого блога «Мелкое и глубокое копирование», и мы свяжемся с вами как можно скорее.