Copia profunda de un array en Java
-
Copia profunda usando la función
System.arraycopy()
en Java -
Copia profunda de un array usando el comando
Arrays.copyOf
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 Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn