Если вам нужно работать с необработанными массивами, а не с 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
с защитной логикой, чем то, что вы пытаетесьdo действителен.
System.arraycopy
- это самый быстрый способ копирования массивов.