Se si deve lavorare con array prime e non ArrayListquindi Arraysha quello che serve. Se guardi il codice sorgente, questi sono i modi assolutamente migliori per ottenere una copia di un array. Hanno un bel po 'di programmazione difensiva perché il System.arraycopy()metodo genera molte eccezioni non controllate se si alimentano parametri illogici.
È possibile utilizzare uno dei due Arrays.copyOf()che verrà copiato dal primo Nthall'elemento nel nuovo array più corto.
public static <T> T[] copyOf(T[] original, int newLength)
Copia l'array specificato, troncando o riempiendo con null (se necessario) in modo che la copia abbia la lunghezza specificata. Per tutti gli indici validi sia nell'array originale che nella copia, i due array conterranno valori identici. Per tutti gli indici validi nella copia ma non l'originale, la copia conterrà null. Tali indici esistono se e solo se la lunghezza specificata è maggiore di quella dell'array originale. L'array risultante è esattamente della stessa classe dell'array originale.
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()farà anche il trucco:
public static <T> T[] copyOfRange(T[] original, int from, int to)
Copia l'intervallo specificato dell'array specificato in un nuovo array. L'indice iniziale dell'intervallo (da) deve trovarsi tra zero e lunghezza originale, incluso. Il valore nell'originale [da] viene inserito nell'elemento iniziale della copia (a meno che da == original.length o da == a). I valori degli elementi successivi nell'array originale vengono inseriti negli elementi successivi nella copia. L'indice finale dell'intervallo (a), che deve essere maggiore o uguale a da, può essere maggiore di original.length, nel qual caso il valore null viene inserito in tutti gli elementi della copia il cui indice è maggiore o uguale all'originale. lunghezza - da. La lunghezza dell'array restituito sarà a - da. L'array risultante è esattamente della stessa classe dell'array originale.
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 }
Come puoi vedere, entrambi questi sono solo funzioni wrapper System.arraycopycon logica difensiva che ciò che stai cercando di fare è valido.
System.arraycopy è il modo più veloce in assoluto per copiare array.