Técnicas de Copia de Arrays en Java: Guía Completa
Técnicas de Copia de Arrays en Java
Aprende a duplicar arrays unidimensionales y bidimensionales en Java usando asignación, bucles, System.arraycopy, Arrays.copyOfRange y más, con ejemplos claros y consejos de mejores prácticas.
1. Copia con el Operador de Asignación
Asignar una variable de array a otra es el método más simple. Copia la referencia, no los datos.
class Main {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5, 6};
int[] positiveNumbers = numbers; // copia de referencia
for (int number : positiveNumbers) {
System.out.print(number + ", ");
}
}
}
Salida:
1, 2, 3, 4, 5, 6
Tanto numbers como positiveNumbers ahora apuntan al mismo objeto array. Cambiar un elemento afecta al otro:
class Main {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5, 6};
int[] positiveNumbers = numbers;
numbers[0] = -1;
for (int number : positiveNumbers) {
System.out.print(number + ", ");
}
}
}
Salida:
-1, 2, 3, 4, 5, 6
Esta es una copia superficial (shallow copy). Para evitar efectos secundarios no intencionados, usa una técnica de copia profunda.
2. Copia Profunda con un Bucle
Iterar sobre cada elemento y asignarlo a un nuevo array crea una copia independiente.
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[] source = {1, 2, 3, 4, 5, 6};
int[] destination = new int[source.length];
for (int i = 0; i < source.length; ++i) {
destination[i] = source[i];
}
System.out.println(Arrays.toString(destination));
}
}
Salida:
[1, 2, 3, 4, 5, 6]
Como source y destination son objetos distintos, las modificaciones a uno no afectan al otro.
3. Usando System.arraycopy()
El método System.arraycopy de Java ofrece una forma rápida e integrada de copiar segmentos de array.
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
src– array origensrcPos– índice inicial en el origendest– array destinodestPos– índice inicial en el destinolength– número de elementos a copiar
Ejemplo:
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[] n1 = {2, 3, 12, 4, 12, -2};
int[] n2 = new int[n1.length];
System.arraycopy(n1, 0, n2, 0, n1.length);
System.out.println("n2 = " + Arrays.toString(n2));
int[] n3 = new int[5];
System.arraycopy(n1, 2, n3, 1, 2);
System.out.println("n3 = " + Arrays.toString(n3));
}
}
Salida:
n2 = [2, 3, 12, 4, 12, -2] n3 = [0, 12, 4, 0, 0]
4. Copia con Arrays.copyOfRange()
Cuando necesitas un nuevo array que contenga un segmento específico, Arrays.copyOfRange es ideal.
import java.util.Arrays;
class ArraysCopy {
public static void main(String[] args) {
int[] source = {2, 3, 12, 4, 12, -2};
int[] destination1 = Arrays.copyOfRange(source, 0, source.length);
System.out.println("destination1 = " + Arrays.toString(destination1));
int[] destination2 = Arrays.copyOfRange(source, 2, 5);
System.out.println("destination2 = " + Arrays.toString(destination2));
}
}
Salida:
destination1 = [2, 3, 12, 4, 12, -2] destination2 = [12, 4, 12]
5. Copia de Arrays 2D con un Bucle
La copia profunda de un array bidimensional requiere copiar cada fila individualmente.
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[][] source = {
{1, 2, 3, 4},
{5, 6},
{0, 2, 42, -4, 5}
};
int[][] destination = new int[source.length][];
for (int i = 0; i < destination.length; ++i) {
destination[i] = new int[source[i].length];
for (int j = 0; j < destination[i].length; ++j) {
destination[i][j] = source[i][j];
}
}
System.out.println(Arrays.deepToString(destination));
}
}
Salida:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
6. Copia de Array 2D con System.arraycopy()
Reemplaza el bucle interno con arraycopy para código más limpio.
import java.util.Arrays;
class Main {
public static void main(String[] args) {
int[][] source = {
{1, 2, 3, 4},
{5, 6},
{0, 2, 42, -4, 5}
};
int[][] destination = new int[source.length][];
for (int i = 0; i < source.length; ++i) {
destination[i] = new int[source[i].length];
System.arraycopy(source[i], 0, destination[i], 0, destination[i].length);
}
System.out.println(Arrays.deepToString(destination));
}
}
Salida:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
Java
- Dominando arrays en C#: Declaración, inicialización y operaciones
- Arrays en C++: Declaración, inicialización y técnicas con punteros
- Asignación dinámica de arrays en C++: Guía práctica con ejemplos de código
- Dominar Operadores en Java: Tipos, Sintaxis y Ejemplos Prácticos
- Comentarios en Java: Tipos, Uso y Mejores Prácticas
- Dominando interfaces en Java: Conceptos, implementación y mejores prácticas
- Dominando Try‑with‑Resources en Java: Gestión automática de recursos explicada
- Anotaciones en Java explicadas: Tipos, ubicación y ejemplos prácticos
- Tutorial de arrays en Java: Declaración, creación e inicialización – Código de ejemplo
- Crear un array de objetos en Java: Guía paso a paso
- Domine Bubble Sort en Java: Ejemplo Claro y Recorrido Paso a Paso