Cómo implementar la copia superficial y la copia profunda en Java



Este artículo le proporcionará un conocimiento detallado y completo de la copia superficial y la copia profunda en Java con ejemplos.

La clonación es un proceso de creación de una réplica o copia de objeto, método de clonación Java.lang.Object se utiliza para crear una copia o réplica de un objeto. Los objetos java que implementan la interfaz Cloneable son elegibles para usar el método de clonación. En este artículo, analizaremos la copia superficial y la copia profunda en el siguiente orden:

Creación de una copia del objeto Java

Podemos crear una réplica o copia del objeto java mediante





1. Crear una copia de un objeto en una ubicación de memoria diferente. Esto se llama copia profunda.

2. Crear una nueva referencia que apunte a la misma ubicación de memoria. Esto también se denomina copia superficial.



Copia superficial

La implementación predeterminada del método de clonación crea una copia superficial del objeto de origen, significa que se crea una nueva instancia de tipo Object, copia todos los campos en una nueva instancia y devuelve un nuevo objeto de tipo 'Object'. Este Objeto necesita explícitamente ser encasillado en el tipo de objeto del objeto fuente.

Este objeto tendrá una copia exacta de todos los campos del objeto fuente, incluido el tipo primitivo y las referencias al objeto. Si el objeto de origen contiene referencias a otros objetos en el campo, en la nueva instancia solo habrá referencias a esos objetos, no se crea una copia de esos objetos. Esto significa que si hacemos cambios en la copia superficial, los cambios se reflejarán en el objeto de origen. Ambas instancias no son independientes.

diferencia entre marioneta y chef

El método clon en la clase Object está protegido por naturaleza, por lo que no todas las clases pueden usar el método clone (). Debe implementar la interfaz clonable y anular el método de clonación. Si la interfaz Cloneable no está implementada, obtendrá CloneNotSupportedException.super.clone () devolverá una copia superficial según la implementación en la clase Object.



Código para copia superficial

paquete com.test class Departamento {String empId String grade String designación público Departamento (String empId, String grade, String designation) {this.empId = empId this.grade = calificar this.designation = designation}} clase Empleado implementa Cloneable {int id Nombre de cadena Departamento público Empleado (int id, String name, Departamento de departamento) {this.id = id this.name = name this.dept = dept} // Versión predeterminada del método clone (). Crea una copia superficial de un objeto. objeto protegido clone () lanza CloneNotSupportedException {return super.clone ()}} public class ShallowCopyInJava {public static void main (String [] args) {Departamento dept1 = nuevo Departamento ('1', 'A', 'AVP') Empleado emp1 = new Employee (111, 'John', dept1) Employee emp2 = null try {// Creando un clon de emp1 y asignándolo a emp2 emp2 = (Employee) emp1.clone ()} catch (CloneNotSupportedException e) {e. printStackTrace ()} // Imprimiendo la designación de 'emp1' System.out.println (emp1.dept.designation) // Salida: AVP // Cambiando la designación de 'emp2' emp2.dept.designation = 'Director' // Este cambio se reflejará en el empleado original 'emp1' System.out.println (emp1.dept.designation) // Output: Director}}

Salida:

Output-Shallow-Copy

que es marioneta en devops

En el ejemplo anterior, tenemos una clase de empleado emp1 que tiene tres variables de clase id (int), nombre (cadena) y departamento (departamento).

Ahora clonamos emp1 a emp2 para crear una copia superficial, después de eso cambiamos la designación usando el objeto emp2 y verificamos que los mismos cambios se reflejaran también en emp1.


Copia profunda

La copia profunda de un objeto tendrá una copia exacta de todos los campos del objeto fuente como una copia superficial, pero a diferencia de la copia cetrina, si el objeto fuente tiene alguna referencia al objeto como campos, entonces se crea una réplica del objeto llamando a clone método. Esto significa que tanto los objetos de origen como los de destino son independientes entre sí. Cualquier cambio realizado en el objeto clonado no afectará al objeto de origen.

Código para copia profunda

paquete com.test class Departamento implementa Cloneable {String empId String grade String designation public Department (String empId, String grade, String designation) {this.empId = empId this.grade = grade this.designation = designation} // Versión predeterminada del clon () método. objeto protegido clone () lanza CloneNotSupportedException {return super.clone ()}} clase Empleado implementa Cloneable {int id Nombre de cadena Departamento público Empleado (int id, Nombre de cadena, departamento de departamento) {this.id = id this.name = nombre this.dept = dept} // Reemplazo del método clone () para crear una copia profunda de un objeto. objeto protegido clone () lanza CloneNotSupportedException {Empleado emp = (Empleado) super.clone () emp.dept = (Departamento) dept.clone () return emp}} public class DeepCopyInJava {public static void main (String [] args) { Departamento dept1 = nuevo Departamento ('1', 'A', 'AVP') Empleado emp1 = nuevo Empleado (111, 'John', dept1) Empleado emp2 = null try {// Creando un clon de emp1 y asignándolo a emp2 emp2 = (Empleado) emp1.clone ()} catch (CloneNotSupportedException e) {e.printStackTrace ()} // Imprimiendo la designación de 'emp1' System.out.println (emp1.dept.designation) // Salida: AVP / / Cambiar la designación de 'emp2' emp2.dept.designation = 'Director' // Este cambio se reflejará en el empleado original 'emp1' System.out.println (emp1.dept.designation) // Salida: AVP}}

Salida:

En el ejemplo anterior de Copia profunda, a diferencia de la copia superficial, los objetos de origen y destino son independientes entre sí. Cualquier cambio realizado en emp2 no afectará a emp1.

Diferencia entre copia superficial y copia profunda

Copia superficial Copia profunda
El objeto clonado y el objeto de origen no están completamente separadosLos objetos clonados y los objetos de origen son completamente independientes entre sí.
Los cambios realizados en la instancia clonada afectarán la variable de referencia del objeto de origenLos cambios realizados en la instancia clonada no afectarán la variable de referencia del objeto de origen.
La versión predeterminada del clon es la copia superficial.Para crear una copia profunda, necesitamos anular el método de clonación de la clase Object.
Se prefiere la copia superficial si las variables de clase del objeto son solo de tipo primitivo como camposSe prefiere una copia profunda si las variables de clase del objeto tienen referencias a otros objetos como campos.
Es relativamente rapidoEs relativamente lento.

Con esto, llegamos al final del artículo de Copia superficial y Copia profunda. Espero que comprenda las diversas diferencias entre los dos.

pasar por valor y pasar por referencia en java

Revisar la por Edureka, una empresa de aprendizaje en línea de confianza con una red de más de 250.000 alumnos satisfechos repartidos por todo el mundo. El curso de certificación y capacitación Java J2EE y SOA de Edureka está diseñado para estudiantes y profesionales que desean ser desarrolladores de Java.

Tienes una pregunta para nosotros? Menciónelo en la sección de comentarios de este blog de 'Copia superficial y copia profunda' y nos comunicaremos con usted lo antes posible.