Se si deve lavorare con array prime e non ArrayList
quindi Arrays
ha 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 Nth
all'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.arraycopy
con logica difensiva che ciò che stai cercando di fare è valido.
System.arraycopy
è il modo più veloce in assoluto per copiare array.