Copiare un array in Java

Copiare un array in Java

Per copiare un array in Java, ci sono diversi modi.

Personalmente ne conosco 4 (e mezzo se contiamo due metodi molto simili); tra questi ce ne è uno sbagliato:

A me personalmente piace di più usare i metodi della classe Arrays.

Comunque vi posto tutti i metodi, che eseguono le stesse identiche operazioni.

Studiatevi l'output per vedere perchè il primo metodo è concettualmente sbagliato:

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        sbagliato();
        objClone();
        arrsCopyOf();
        sysArrsCopy();
    }

    public static void sbagliato() {
        int[] arr1 = {1, 2, 3, 4, 5};
        int[] arr2 = arr1;
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        arr1[2] = 50;
        arr2[2] = 23;
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
    }

    public static void objClone() {
        int[] arr1 = {1, 2, 3, 4, 5};
        int[] arr2 = arr1.clone();
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        arr1[2] = 50;
        arr2[2] = 23;
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
    }

    public static void arrsCopyOf() {
        int[] arr1 = {1, 2, 3, 4, 5};
        int[] arr2 = Arrays.copyOf(arr1, arr1.length);
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        arr1[2] = 50;
        arr2[2] = 23;
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
    }

    public static void sysArrsCopy() {
        int[] arr1 = {1, 2, 3, 4, 5};
        int[] arr2 = new int[arr1.length];
        System.arraycopy(arr1, 0, arr2, 0, arr1.length);
        arr1[2] = 50;
        arr2[2] = 23;
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
    }
}

Una nota su System.arraycopy, che non è proprio immediato da usare.

Richiede quattro parametri:

  • l'array sorgente da copiare
  • il valore da cui cominciare a copiare
  • l'array destinazione
  • la posizione di partenza in cui copiare (può essere anche l'array già esista e sia diverso dal primo)
  • il numero di elementi da copiare

Ovviamente, nell'esempio fatto, il secondo array sarà identico al primo.

Enjoy!