Se você precisa trabalhar com matrizes de matérias e não ArrayList
em seguida, Arrays
tem o que você precisa. Se você olhar para o código-fonte, essas são as melhores maneiras de obter uma cópia de uma matriz. Eles têm uma boa parte de programação defensiva porque o System.arraycopy()
método lança muitas exceções não verificadas se você alimentar parâmetros ilógicos.
Você pode usar o Arrays.copyOf()
que copiará do primeiro para o Nth
elemento para a nova matriz mais curta.
public static <T> T[] copyOf(T[] original, int newLength)
Copia a matriz especificada, truncando ou preenchendo com nulos (se necessário) para que a cópia tenha o comprimento especificado. Para todos os índices válidos na matriz original e na cópia, as duas matrizes conterão valores idênticos. Para quaisquer índices válidos na cópia, mas não no original, a cópia conterá nulo. Esses índices existirão se, e somente se, o comprimento especificado for maior que o da matriz original. A matriz resultante é exatamente da mesma classe que a 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 }
ou Arrays.copyOfRange()
também fará o truque:
public static <T> T[] copyOfRange(T[] original, int from, int to)
Copia o intervalo especificado da matriz especificada para uma nova matriz. O índice inicial do intervalo (de) deve estar entre zero e comprimento original, inclusive. O valor no original [from] é colocado no elemento inicial da cópia (a menos que = = original.length ou de == a). Os valores dos elementos subseqüentes na matriz original são colocados nos elementos subseqüentes na cópia. O índice final do intervalo (a), que deve ser maior ou igual a partir de, pode ser maior que original.length, caso em que nulo é colocado em todos os elementos da cópia cujo índice é maior ou igual ao original. comprimento - de. O comprimento da matriz retornada será de - para. A matriz resultante é exatamente da mesma classe que a 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 você pode ver, ambas são apenas funções de invólucro System.arraycopy
com lógica defensiva de que o que você está tentando fazer é válido.
System.arraycopy
é a maneira mais rápida de copiar matrizes.