Copia profunda de un array en Java

Rupam Yadav 12 octubre 2023
  1. Copia profunda usando la función System.arraycopy() en Java
  2. Copia profunda de un array usando el comando Arrays.copyOf en Java
Copia profunda de un array en Java

En este tutorial, discutimos cómo realizar una copia profunda de un array en Java.

Generalmente, hay dos tipos de métodos de copia de array en Java: la copia superficial y la copia profunda. En la copia superficial, los objetos se copian. Por otro lado, todos los elementos se copian mientras se crea un array diferente en Deep Copy.

A continuación se muestra un ejemplo que muestra lo que sucede cuando copiamos un array en otra directamente. Creamos un array arr1 con elementos y luego inicializamos otro arr2 con arr1. Cuando se cambia cualquier elemento de arr2, el cambio también se refleja en arr1.

import java.util.Arrays;

public class DeepCopy {
  public static void main(String[] args) {
    int[] arr1 = {10, 20, 30};
    System.out.println("arr1 Before copying: " + Arrays.toString(arr1));

    int[] arr2 = arr1;
    System.out.println("arr2 After copying: " + Arrays.toString(arr1));

    arr2[0] = 30;
    System.out.println(
        "arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
  }
}

Producción :

arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [30, 20, 30]

Copia profunda usando la función System.arraycopy() en Java

En el siguiente ejemplo, tomamos un array arr1 con algunos elementos y luego tomamos otra matriz arr2 y le damos el tamaño igual al de arr1. Llamamos al método arrayCopy() de la clase System que copia un array a otra.

La función arrayCopy() toma cuatro argumentos; los dos primeros son el array fuente y la posición inicial de copia en el array fuente. El tercer argumento es el array de destino y su posición inicial, donde copiaremos elementos y la cantidad de elementos que se copiarán en una nueva matriz.

Cuando cambiamos el elemento arr2, al igual que en el ejemplo anterior, los elementos de arr1 no cambian en absoluto.

import java.util.Arrays;

public class DeepCopy {
  public static void main(String[] args) {
    int[] arr1 = {10, 20, 30};
    System.out.println("arr1 Before copying: " + Arrays.toString(arr1));

    int[] arr2 = new int[arr1.length];

    System.arraycopy(arr1, 0, arr2, 0, arr1.length);
    System.out.println("arr2 After copying: " + Arrays.toString(arr1));

    arr2[0] = 30;
    System.out.println(
        "arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
  }
}

Producción :

arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [10, 20, 30]

Copia profunda de un array usando el comando Arrays.copyOf en Java

A continuación, usamos el método copyOf() de la clase de utilidad Arrays. Acepta el array para copiar y su tamaño luego devuelve el array del mismo tipo. Hacemos una nueva matriz arr2 usando este método y verificamos si al cambiar arr2 cambia arr1 o no. La salida muestra el resultado.

Tenga en cuenta que este método y el anterior crean una copia superficial en lugar de una copia profunda cuando el array contiene objetos en lugar de primitivas.

import java.util.Arrays;

public class DeepCopy {
  public static void main(String[] args) {
    int[] arr1 = {10, 20, 30};
    System.out.println("arr1 Before copying: " + Arrays.toString(arr1));

    int[] arr2 = Arrays.copyOf(arr1, arr1.length);
    System.out.println("arr2 After copying: " + Arrays.toString(arr1));

    arr2[0] = 30;
    System.out.println(
        "arr1 after copying and changing an element in arr2: " + Arrays.toString(arr1));
  }
}

Producción :

arr1 Before copying: [10, 20, 30]
arr2 After copying: [10, 20, 30]
arr1 after copying and changing an element in arr2: [30, 20, 30]

También podemos usar Arrays.copyOf() para copiar un array bidimensional. En el siguiente ejemplo, tenemos un array 2D arr. Tenemos una nueva matriz arr2, y en el bucle, usamos Arrays.copyOf que toma cada elemento de arr y lo copia en el arr2 elemento por elemento. Una vez copiado, comprobamos si arr1 cambia si se cambia arr2. Si no cambia, es un array copiada en profundidad.

import java.util.Arrays;

public class DeepCopy {
  public static void main(String[] args) {
    int[][] arr = {{1, 2}, {3, 4}, {5, 6}};

    System.out.println("Values of arr");
    for (int i = 0; i < arr.length; i++)
      for (int j = 0; j < arr.length - 1; j++)
        System.out.println("arr[" + i + "][" + j + "] = " + arr[i][j]);

    System.out.println();

    int[][] arr2 = new int[arr.length][];
    for (int i = 0; i < arr.length; i++) {
      arr2[i] = Arrays.copyOf(arr[i], arr[i].length);
    }

    System.out.println("Values of arr2");

    for (int i = 0; i < arr2.length; i++)
      for (int j = 0; j < arr2.length - 1; j++)
        System.out.println("arr2[" + i + "][" + j + "] = " + arr2[i][j]);

    arr2[0][1] = 5;

    System.out.println();

    System.out.println("Values of arr after changing an element in arr2");
    for (int i = 0; i < arr.length; i++)
      for (int j = 0; j < arr.length - 1; j++)
        System.out.println("arr[" + i + "][" + j + "] = " + arr[i][j]);
  }
}

Producción :

Values of arr
arr[0][0] = 1
arr[0][1] = 2
arr[1][0] = 3
arr[1][1] = 4
arr[2][0] = 5
arr[2][1] = 6

Values of arr2
arr2[0][0] = 1
arr2[0][1] = 2
arr2[1][0] = 3
arr2[1][1] = 4
arr2[2][0] = 5
arr2[2][1] = 6

Values of arr after changing an element in arr2
arr[0][0] = 1
arr[0][1] = 2
arr[1][0] = 3
arr[1][1] = 4
arr[2][0] = 5
arr[2][1] = 6
Rupam Yadav avatar Rupam Yadav avatar

Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.

LinkedIn

Artículo relacionado - Java Array