copia de arrays

Cuando una variable de tipo array se hace igual a otro, se copia la referencia; pero se comparte el array:

 

copia de arrays

ejecución

 

    void copia1() {

        int[] a = new int[]{1, 2, 3};

        System.out.println(Arrays.toString(a));

        int[] b = a;

        System.out.println(Arrays.toString(b));

        a[0] *= 10;

        System.out.println(Arrays.toString(b));

    }

 

 

[1, 2, 3]

 

[1, 2, 3]

 

[10, 2, 3]

 

Si no basta con compartir la referencia, sino que se necesita otra copia de un array, se puede recurrir al método clone(). Si los elementos del array son de un tipo primitivo, se copia su valor. Si son objetos, se copia la referencia, compartiéndose el objeto.

 

copia de arrays

ejecución

 

    void copia2() {

        int[] a = new int[]{1, 2, 3};

        System.out.println(Arrays.toString(a));

        int[] b = a.clone();

        System.out.println(Arrays.toString(b));

        a[0] *= 10;

        System.out.println(Arrays.toString(b));

    }

 

 

[1, 2, 3]

 

[1, 2, 3]

 

[1, 2, 3]

 

    void copia2Objetos() {

        Punto[] a = new Punto[]

            {new Punto(1, 2), new Punto(3, 4)};

        System.out.println(Arrays.toString(a));

        Punto[] b = a.clone();

        System.out.println(Arrays.toString(b));

        a[0].multiplica(-1);

        System.out.println(Arrays.toString(b));

    }

 

 

 

[(1,2), (3,4)]

 

[(1,2), (3,4)]

 

[(-1,-2), (3,4)]

 

    class Punto {

        private int x, y;

 

        public Punto(int x, int y) {

            this.x = x;

            this.y = y;

        }

 

        public void multiplica(int factor) {

            x *= factor;

            y *= factor;

        }

 

        public String toString() {

            return String.format("(%d, %d)", x, y);

        }

    }      

 

La misma situación ocurre cuando tenemos arrays de dos o más dimensiones (efectivamente, se trata de arrays de arrays):

 

copia de arrays

ejecución

    void copia2ArraysBiDi() {

      int[][] a = new int[][]{{1, 2}, {3, 4}};

      System.out.println(Arrays.deepToString(a));

      int[][] b = a.clone();

      System.out.println(Arrays.deepToString(b));

      a[0][0] *= -1;

      System.out.println(Arrays.deepToString(b));

    }

 

 

[</w:t>[1, 2], [3, 4]]

 

[</w:t>[1, 2], [3, 4]]

 

[</w:t>[-1, 2], [3, 4]]

 

Se puede usar el método estándar “arraycopy()”:

T[] a = ...;

T[] b = new int[a.length];

System.arraycopy(a, 0, b, 0, a.length);

 

que es realmente equivalente al método clone(), con los mismos problemas cuando se trata de arrays de objetos:

copia de arrays

ejecución

    void copia20() {

        int[] a = new int[]{1, 2, 3};

        System.out.println(Arrays.toString(a));

        int[] b = new int[a.length];

        System.arraycopy(a, 0, b, 0, a.length);

        System.out.println(Arrays.toString(b));

        a[0] *= 10;

        System.out.println(Arrays.toString(b));

    }

 

 

[1, 2, 3]

 

 

[1, 2, 3]

 

[1, 2, 3]

    void copia21Objetos() {

        Punto[] a = new Punto[]

              {new Punto(1, 2), new Punto(3, 4)};

        System.out.println(Arrays.toString(a));

        Punto[] b = new Punto[a.length];

        System.arraycopy(a, 0, b, 0, a.length);

        System.out.println(Arrays.toString(b));

        a[0].multiplica(-1);

        System.out.println(Arrays.toString(b));

    }

 

 

 

[(1,2), (3,4)]

 

 

[(1,2), (3,4)]

 

[(-1,-2), (3,4)]

 

Se puede usar el método estándar copyOf() de java.util.Arrays:

T[] a = ...;

T[] b = Arrays.copyOf(a, a.length);

que es realmente equivalente al método clone(), con los mismos problemas cuando se trata de arrays de objetos:

copia de arrays

ejecución

    void copia30() {

        int[] a = new int[]{1, 2, 3};

        System.out.println(Arrays.toString(a));

        int[] b = Arrays.copyOf(a, a.length);

        System.out.println(Arrays.toString(b));

        a[0] *= 10;

        System.out.println(Arrays.toString(b));

    }

 

 

[1, 2, 3]

 

[1, 2, 3]

 

[1, 2, 3]

    void copia31Objetos() {

        Punto[] a = new Punto[]

            {new Punto(1, 2), new Punto(3, 4)};

        System.out.println(Arrays.toString(a));

        Punto[] b = Arrays.copyOf(a, a.length);

        System.out.println(Arrays.toString(b));

        a[0].multiplica(-1);

        System.out.println(Arrays.toString(b));

    }

 

 

 

[(1,2), (3,4)]

 

[(1,2), (3,4)]

 

[(-1,-2), (3,4)]

 

Por último, la copia se puede programar explícitamente, que es probablemente la forma más segura de trabajar:

T[] a = ...;

T[] b = new T[a.length];

for (int i = 0; i < a.length; i++)

   b[i] = a[i];

Temas relacionados

8. Arrays (concepto)