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