Если вы должны работать с сырыми массивами , а не ArrayList
то Arrays
есть то , что вам нужно. Если вы посмотрите на исходный код, это самый лучший способ получить копию массива. У них есть немного защитного программирования, потому чтоSystem.arraycopy()
метод генерирует множество непроверенных исключений, если вы передаете ему нелогичные параметры.
Вы можете использовать любой из Arrays.copyOf()
них, который будет копировать с первого Nth
элемента в новый более короткий массив.
public static <T> T[] copyOf(T[] original, int newLength)
Копирует указанный массив с усечением или заполнением нулями (при необходимости), чтобы копия имела указанную длину. Для всех индексов, которые действительны как в исходном массиве, так и в копии, эти два массива будут содержать одинаковые значения. Для любых индексов, которые действительны в копии, но не в оригинале, копия будет содержать ноль. Такие индексы будут существовать тогда и только тогда, когда указанная длина больше, чем у исходного массива. Полученный массив имеет тот же класс, что и исходный массив.
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 }
или Arrays.copyOfRange()
тоже сделает свое дело:
public static <T> T[] copyOfRange(T[] original, int from, int to)
Копирует указанный диапазон указанного массива в новый массив. Начальный индекс диапазона (от) должен лежать между нулем и оригинальной длиной, включительно. Значение в оригинале [из] помещается в начальный элемент копии (если не из == original.length или из == в). Значения из последующих элементов в исходном массиве помещаются в последующие элементы в копии. Конечный индекс диапазона (до), который должен быть больше или равен от, может быть больше, чем original.length, и в этом случае значение null помещается во все элементы копии, индекс которых больше или равен оригиналу. длина - от. Длина возвращаемого массива будет до - от. Полученный массив имеет тот же класс, что и исходный массив.
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 }
Как видите, обе эти функции - просто обертки System.arraycopy
с защитной логикой, что то, что вы пытаетесь сделать, является допустимым.
System.arraycopy
это самый быстрый способ копирования массивов.