Jeśli trzeba pracować z surowych tablic, a nie ArrayList
wtedy Arrays
ma to, czego potrzebujesz. Jeśli spojrzysz na kod źródłowy, są to absolutnie najlepsze sposoby na uzyskanie kopii tablicy. Mają sporo programowania obronnego, ponieważ System.arraycopy()
metoda rzuca wiele niesprawdzonych wyjątków, jeśli podajesz jej nielogiczne parametry.
Możesz użyć jednego, Arrays.copyOf()
który skopiuje od pierwszego do Nth
elementu do nowej krótszej tablicy.
public static <T> T[] copyOf(T[] original, int newLength)
Kopiuje określoną tablicę, obcinając lub dopełniając wartości zerowe (jeśli to konieczne), aby kopia miała określoną długość. Dla wszystkich indeksów, które są poprawne zarówno w oryginalnej tablicy, jak i kopii, dwie tablice będą zawierać identyczne wartości. W przypadku wszystkich indeksów, które są poprawne w kopii, ale nie w oryginale, kopia będzie zawierać null. Takie indeksy będą istnieć wtedy i tylko wtedy, gdy określona długość jest większa niż oryginalnej tablicy. Wynikowa tablica jest dokładnie tej samej klasy co tablica oryginalna.
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 }
lub Arrays.copyOfRange()
zrobi lewę:
public static <T> T[] copyOfRange(T[] original, int from, int to)
Kopiuje określony zakres określonej tablicy do nowej tablicy. Początkowy indeks zakresu (od) musi mieścić się w przedziale od zera do oryginalnej długości. Wartość w oryginale [from] jest umieszczana w początkowym elemencie kopii (chyba że od == original.length lub od == do). Wartości z kolejnych elementów w oryginalnej tablicy są umieszczane w kolejnych elementach w kopii. Końcowy indeks zakresu (do), który musi być większy lub równy od, może być większy niż oryginał. Długość, w którym to przypadku wartość null jest umieszczana we wszystkich elementach kopii, których indeks jest większy lub równy oryginałowi. długość - od. Długość zwracanej tablicy będzie wynosić do - od. Wynikowa tablica jest dokładnie tej samej klasy co tablica oryginalna.
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 }
Jak widać, obie są po prostu funkcjami otoki System.arraycopy
z logiką obronną, że to, co próbujesz zrobić, jest prawidłowe.
System.arraycopy
jest absolutnie najszybszym sposobem kopiowania tablic.