Copia de array en Java

Dada una array, necesitamos copiar sus elementos en una array diferente, a un usuario ingenuo le viene a la mente lo siguiente, sin embargo, es incorrecto como se muestra a continuación:

// Java Program to Illustrate Wrong Way Of Copying an Array

// Input array
int a[] = { 1, 8, 3 };

// Creating an array b[] of same size as a[]
int b[] = new int[a.length];

// Doesn't copy elements of a[] to b[], only makes
// b refer to same location
b = a;

Producción: 

Salida Explicación: Cuando hacemos «b = a», en realidad estamos asignando una referencia a la array. Por lo tanto, si hacemos algún cambio en una array, también se reflejará en otras arrays porque tanto a como b se refieren a la misma ubicación. También podemos verificarlo con código como se muestra a continuación de la siguiente manera:

Ejemplo:

Java

// A Java program to demonstrate that simply
// assigning one array reference is incorrect
public class Test {
    public static void main(String[] args)
    {
        int a[] = { 1, 8, 3 };
 
        // Create an array b[] of same size as a[]
        int b[] = new int[a.length];
 
        // Doesn't copy elements of a[] to b[],
        // only makes b refer to same location
        b = a;
 
        // Change to b[] will also reflect in a[]
        // as 'a' and 'b' refer to same location.
        b[0]++;
 
        System.out.println("Contents of a[] ");
        for (int i = 0; i < a.length; i++)
            System.out.print(a[i] + " ");
 
        System.out.println("\n\nContents of b[] ");
        for (int i = 0; i < b.length; i++)
            System.out.print(b[i] + " ");
    }
}
Producción

Contents of a[] 
2 8 3 

Contents of b[] 
2 8 3 

Métodos:

Hemos visto trabajo interno al copiar elementos y casos extremos que se deben tener en cuenta después de superar los errores generados anteriormente, por lo que ahora podemos proponer formas correctas de copiar la array como se indica a continuación:

  1. Iterando cada elemento de la array original dada y copiando un elemento a la vez
  2. Usando el método clon()
  3. Usando el método arraycopy()
  4. Usando el método copyOf() de la clase Arrays
  5. Usando el método copyOfRange() de la clase Arrays

Método 1: iterar cada elemento de la array original dada y copiar un elemento a la vez. Con el uso de este método, garantiza que cualquier modificación a b no alterará la array original a, como se muestra en el siguiente ejemplo:

Ejemplo:

Java

// Java program to demonstrate copying by
// one by one assigning elements between arrays
 
// Main class
public class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
        // Input array a[]
        int a[] = { 1, 8, 3 };
 
        // Create an array b[] of same size as a[]
        int b[] = new int[a.length];
 
        // Copying elements of a[] to b[]
        for (int i = 0; i < a.length; i++)
            b[i] = a[i];
 
        // Changing b[] to verify that
        // b[] is different from a[]
        b[0]++;
 
        // Display message only
        System.out.println("Contents of a[] ");
 
        for (int i = 0; i < a.length; i++)
            System.out.print(a[i] + " ");
 
        // Display message only
        System.out.println("\n\nContents of b[] ");
 
        for (int i = 0; i < b.length; i++)
            System.out.print(b[i] + " ");
    }
}
Producción

Contents of a[] 
1 8 3 

Contents of b[] 
2 8 3 

Método 2: Usar el método Clone() 

En el método anterior, teníamos que iterar sobre toda la array para hacer una copia, ¿podemos hacerlo mejor? Sí, podemos usar el método de clonación en Java

Ejemplo:

Java

// Java program to demonstrate Copying of Array
// using clone() method
 
// Main class
public class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
        // Input array a[]
        int a[] = { 1, 8, 3 };
 
        // Copying elements of a[] to b[]
        int b[] = a.clone();
 
        // Changing b[] to verify that
        // b[] is different from a[]
        b[0]++;
 
        // Display message for better readability
        System.out.println("Contents of a[] ");
 
        for (int i = 0; i < a.length; i++)
            System.out.print(a[i] + " ");
 
        // Display message for better readability
        System.out.println("\n\nContents of b[] ");
 
        for (int i = 0; i < b.length; i++)
            System.out.print(b[i] + " ");
    }
}
Producción

Contents of a[] 
1 8 3 

Contents of b[] 
2 8 3 

Método 3: Usando el método arraycopy()

También podemos usar el método System.arraycopy() . El sistema está presente en el paquete java.lang. Su firma es como: 

public static void arraycopy(Object src, int srcPos, Object dest, 
                             int destPos, int length)

Parámetros:

  • src denota la array de origen.
  • srcPos es el índice desde el que comienza la copia.
  • dest denota la array de destino
  • destPos es el índice desde el que se colocan los elementos copiados en la array de destino.
  • length es la longitud del subarreglo que se va a copiar.

Ejemplo:

Java

// Java program to demonstrate array
// copy using System.arraycopy()
 
// Main class
public class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
        // Custom input array
        int a[] = { 1, 8, 3 };
 
        // Creating an array b[] of same size as a[]
        int b[] = new int[a.length];
 
        // Copying elements of a[] to b[]
        System.arraycopy(a, 0, b, 0, 3);
 
        // Changing b[] to verify that
        // b[] is different from a[]
        b[0]++;
 
        // Display message only
        System.out.println("Contents of a[] ");
 
        for (int i = 0; i < a.length; i++)
            System.out.print(a[i] + " ");
 
        // Display message only
        System.out.println("\n\nContents of b[] ");
 
        for (int i = 0; i < b.length; i++)
            System.out.print(b[i] + " ");
    }
}
Producción

Contents of a[] 
1 8 3 

Contents of b[] 
2 8 3 

Método 4: Usar el método copyOf() de la clase Arrays 

Si queremos copiar los primeros elementos de una array o una copia completa de la array, puede usar este método.

Sintaxis: 

public static int[] copyOf​(int[] original, int newLength)

Parámetros:

  • array original
  • Longitud de la array que se va a copiar.

Ejemplo:

Java

// Java program to demonstrate array
// copy using Arrays.copyOf()
 
// Importing Arrays class from utility class
import java.util.Arrays;
 
// Main class
class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
        // Custom input array
        int a[] = { 1, 8, 3 };
 
        // Create an array b[] of same size as a[]
        // Copy elements of a[] to b[]
        int b[] = Arrays.copyOf(a, 3);
 
        // Change b[] to verify that
        // b[] is different from a[]
        b[0]++;
 
        System.out.println("Contents of a[] ");
 
        // Iterating over array. a[]
        for (int i = 0; i < a.length; i++)
            System.out.print(a[i] + " ");
 
        System.out.println("\n\nContents of b[] ");
 
        // Iterating over array b[]
        for (int i = 0; i < b.length; i++)
            System.out.print(b[i] + " ");
    }
}
Producción

Contents of a[] 
1 8 3 

Contents of b[] 
2 8 3 

Método 5: Usar el método copyOfRange() de la clase Arrays

Este método copia el rango especificado de la array especificada en una nueva array.

public static int[] copyOfRange​(int[] original, int from, int to)

Parámetros:

  • Array original de la que se va a copiar un rango
  • Índice inicial del rango a copiar
  • Índice final del rango a copiar, exclusivo

Ejemplo:

Java

// Java program to demonstrate array
// copy using Arrays.copyOfRange()
 
// Importing Arrays class from utility package
import java.util.Arrays;
 
// Main class
class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
        // Custom input array
        int a[] = { 1, 8, 3, 5, 9, 10 };
 
        // Creating an array b[] and
        // copying elements of a[] to b[]
        int b[] = Arrays.copyOfRange(a, 2, 6);
 
        // Changing b[] to verify that
        // b[] is different from a[]
 
        // Iterating over array a[]
        System.out.println("Contents of a[] ");
        for (int i = 0; i < a.length; i++)
            System.out.print(a[i] + " ");
 
        // Iterating over array b[]
        System.out.println("\n\nContents of b[] ");
        for (int i = 0; i < b.length; i++)
            System.out.print(b[i] + " ");
    }
}
Producción

Contents of a[] 
1 8 3 5 9 10 

Contents of b[] 
3 5 9 10 

Por último, analicemos la descripción general de los métodos anteriores: 

  • Simplemente asignar referencias es incorrecto
  • La array se puede copiar iterando sobre una array y asignando elementos uno por uno.
  • Podemos evitar la iteración sobre elementos usando clone() o System.arraycopy()
  • clone() crea una nueva array del mismo tamaño, pero System.arraycopy() se puede usar para copiar desde un rango de origen a un rango de destino.
  • System.arraycopy() es más rápido que clone() ya que utiliza la interfaz nativa de Java
  • Si desea copiar los primeros elementos de una array o una copia completa de una array, puede usar el método Arrays.copyOf().
  • Arrays.copyOfRange() se usa para copiar un rango específico de una array. Si el índice inicial no es 0, puede usar este método para copiar una array parcial.

Este artículo es una contribución de Ashutosh Kumar . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *