Copiar arrays en Java

Cómo copiar un array en otro en Java

En esta entrada se explican diferentes formas de copiar arrays en Java.

Cuando nos surge la necesidad de realizar una copia de un array puede parecernos lógico utilizar una instrucción de asignación como haríamos con una variable de tipo primitivo.

Si disponemos de un array llamado A de 5 elementos de tipo entero:

int [] A = {1,2,3,4,5};

y queremos copiar su contenido en otro array B mediante la instrucción:

int []  B = A;

en realidad no estamos haciendo una copia del array A.  Lo que estamos haciendo es asignar a la variable B el contenido de la variable A y lo que contiene A es la dirección de memoria donde se encuentra el array.

Lo que hemos conseguido no es una copia del array A sino que hemos creado un alias o referencia alternativa al array.

De esta forma ahora tenemos dos formas de acceder al mismo array: utilizando la variable A o utilizando la variable B. Ambas nos llevan a la misma zona de memoria donde se encuentra el array. 

Tenemos un solo array al que podemos acceder mediante dos variables.

Para entenderlo mejor vamos a representarlo de forma gráfica.

Cuando se ejecuta la instrucción que crea el array A:

int [] A = {1,2,3,4,5};

se realizan dos operaciones: primero crea un bloque de memoria para almacenar el array de 5 enteros y después se asigna la dirección de inicio del bloque de memoria, también llamado referencia del array, a la variable A.



Si ahora declaramos la variable B y le asignamos el valor de A:

int []  B = A;

Esta  instrucción crea una variable B y le asigna el contenido de la variable A. Lo que estamos haciendo es copiar en B la dirección de memoria del array A.

B = 0x157FC;

En memoria tenemos un solo array al que podemos acceder mediante dos variables: A y B. 

Ahora podemos realizar operaciones sobre el array utilizando las dos variables:

A[0] = 100;

B[3] = 500;

Ambas modifican el mismo array:


Hemos podido comprobar que de esta forma no estamos copiando un array en otro.

Para copiar el contenido de un array en otro podemos hacerlo de varias maneras:

  • Creando un nuevo array y mediante un bucle y realizar la copia elemento a elemento.
  • Utilizando el método clone().
  • Utilizando el método System.arraycopy().

Copiar un array unidimensional mediante un bucle elemento a elemento.

Esta es la forma trivial de hacerlo.

Si tenemos un array A de enteros

int[] A = {1, 2, 3, 4, 5};

y queremos hacer una copia de este array A en otro array llamado B lo que haremos será crear el nuevo array B y copiar elemento a elemento:

int[] B = new int[5];    //se crea un nuevo array B

for (int i = 0; i < A.length; i++) {  //se copia cada elemento de A en B                                          
     B[i] = A[i];
}

Copiar un array unidimensional utilizando el método clone.

De forma general, para copiar arrays con el método clone se escribe la instrucción:

arrayDestino = arrayOrigen.clone();

El método clone crea en memoria una copia del arrayOrigen. La dirección de memoria del array creado a arrayDestino. De esta forma obtenemos dos array distintos con el mismo contenido.

Ejemplo:

int[] v = {1, 2, 3, 4, 5, 6};

int [] w = v.clone();

El proceso realizado se puede representar de forma gráfica de esta forma:

int[] v = {1, 2, 3, 4, 5, 6};

int [] w = v.clone();


La instrucción v.clone() crea en memoria un nuevo array y copia en el nuevo array el contenido del array v. La dirección de inicio del array creado se asigna a la variable w.

Copiar un array unidimensional utilizando System.arraycopy().

Este método copia el contenido de un array en otro array que ya debe existir.

Para realizar la copia hay que indicar al método arraycopy 5 argumentos en este orden:

  1. el array origen
  2. desde qué posición del array origen vamos a copiar
  3. el array destino
  4. a partir de qué posición vamos a copiar en el array de destino
  5. cantidad de elementos a copiar

Ejemplo: disponemos de los arrays A y B

int[] A = {2, 13, 7, 16, 9, 14, 33};

int[] B = new int[7];


 

Para copiar el array A en el array B se escribe la instrucción:

System.arraycopy(A, 0, B, 0, A.length);

Los valores que hemos escrito indican el nombre del array de origen (A), a partir de qué posición del array A vamos a copiar, en este caso desde la primera posición (0), a continuación el array de destino (B),  a partir de qué posición vamos a copiar en el array de destino, en este caso desde la primera posición (0) y finalmente el número de elementos a copiar, este caso queremos copiar todos los elementos de A por lo que hemos indicado A.length.

Como resultado se ha realizado una copia completa del array A en el Array B.


La ventaja que nos ofrece este método es que podemos copiar solo una parte de un array en otro. Además, los arrays origen y destino pueden tener tamaños diferentes.

Por ejemplo, disponemos de los siguientes arrays:

int[] A = {2, 13, 7, 16, 9, 14, 33};

int[] B = new int[3];

int[] C = new int[3];

int[] D = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};

Vamos a copiar los tres primeros elementos del array A en el array B, los tres últimos elementos de A en el array C y los elementos de las posiciones 3 y 4 del array A en las posiciones 2 y 3 del array  D.

Escribiremos las instrucciones:

System.arraycopy(A, 0, B, 0, 3); //copia los tres primeros elementos de A en B
System.arraycopy(A, 4, C, 0, 3); //copia los tres últimos elementos de A en C                                     
System.arraycopy(A, 3, D, 2, 2); //copia los elementos 3 y 4 de A en los elementos 2 y 3 de D

El contenido final de los arrays después de realizar la copia es el siguiente:

Array B:

2 13 7

Array C:

9 14 33

Array D:

1 1 16 9 1 1 1 1 1 1

 


1 comentario: