Si tiene que trabajar con matrices en bruto y no ArrayList
se Arrays
tiene lo que necesita. Si observa el código fuente, estas son las mejores formas de obtener una copia de una matriz. Tienen una buena programación defensiva porque el System.arraycopy()
método arroja muchas excepciones no verificadas si lo alimenta con parámetros ilógicos.
Puede usar cualquiera de los dos Arrays.copyOf()
que copiará desde el primer Nth
elemento al nuevo conjunto más corto.
public static <T> T[] copyOf(T[] original, int newLength)
Copia la matriz especificada, truncando o rellenando con nulos (si es necesario) para que la copia tenga la longitud especificada. Para todos los índices que son válidos tanto en la matriz original como en la copia, las dos matrices contendrán valores idénticos. Para cualquier índice que sea válido en la copia pero no en el original, la copia contendrá nulo. Tales índices existirán si y solo si la longitud especificada es mayor que la de la matriz original. La matriz resultante es exactamente de la misma clase que la matriz original.
2770
2771 public static <T,U> T[] More ...copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
2772 T[] copy = ((Object)newType == (Object)Object[].class)
2773 ? (T[]) new Object[newLength]
2774 : (T[]) Array.newInstance(newType.getComponentType(), newLength);
2775 System.arraycopy(original, 0, copy, 0,
2776 Math.min(original.length, newLength));
2777 return copy;
2778 }
o Arrays.copyOfRange()
también hará el truco:
public static <T> T[] copyOfRange(T[] original, int from, int to)
Copia el rango especificado de la matriz especificada en una nueva matriz. El índice inicial del rango (desde) debe estar entre cero y la longitud original, inclusive. El valor en original [from] se coloca en el elemento inicial de la copia (a menos que sea == original.length o from == to). Los valores de elementos posteriores en la matriz original se colocan en elementos posteriores en la copia. El índice final del rango (a), que debe ser mayor o igual que from, puede ser mayor que original.length, en cuyo caso se coloca nulo en todos los elementos de la copia cuyo índice es mayor o igual que el original. longitud - desde. La longitud de la matriz devuelta será desde -. La matriz resultante es exactamente de la misma clase que la matriz original.
3035 public static <T,U> T[] More ...copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
3036 int newLength = to - from;
3037 if (newLength < 0)
3038 throw new IllegalArgumentException(from + " > " + to);
3039 T[] copy = ((Object)newType == (Object)Object[].class)
3040 ? (T[]) new Object[newLength]
3041 : (T[]) Array.newInstance(newType.getComponentType(), newLength);
3042 System.arraycopy(original, from, copy, 0,
3043 Math.min(original.length - from, newLength));
3044 return copy;
3045 }
Como puede ver, ambos son solo funciones de envoltura System.arraycopy
con lógica defensiva de que lo que está tratando de hacer es válido.
System.arraycopy
es la forma más rápida de copiar matrices.