Каков предпочтительный способ копирования массива типа non-primitve в Java? Как насчет проблем с производительностью?Java: Копировать массив не примитивного типа
ответ
Старая школа путь был:
public static void java.lang.System.arraycopy(Object src, int srcPos,
Object dest, int destPos, int length)
Это Копирует из одного существующего массива в другой. Вы должны сами распределить новый массив ... при условии, что вы делаете копию из массива.
От JDK 6 и далее класс java.util.Arrays
имеет ряд методов для создания копий массивов с новым размером copyOf
. Те, которые являются важными являются:
public static <T> T[] copyOf(T[] original, int newLength)
и
public static <T,U> T[] copyOf(U[] original, int newLength,
Class<? extends T[]> newType)
Это первый один делает копию, используя оригинальный тип массива, а второй один делает копию с другим типом массива.
Обратите внимание, что как arraycopy, так и 3 аргумента copyOf должны проверять типы каждого из элементов исходного (исходного) массива на тип целевого массива. Таким образом, оба могут исключать исключения типа. 2 аргумента copyOf (по крайней мере, теоретически) не требует проверки типа и, следовательно, должен быть (теоретически) быстрее. На практике относительная производительность будет зависимой от реализации. Например, arraycopy
часто подвергается специальной обработке со стороны JVM.
Для тех, кто задавался вопросом 'int [] array = {1, 2, 3}; int [] copy = Arrays.copyOf (array, array.length, Integer.class); 'не будет компилироваться (_" Метод copyOf (int [], int) в типе Arrays не применим для аргументов (int [], int, класс
System.arraycopy
(который дает возможность копировать произвольные части массива с помощью параметров offset
и length
). Или
java.util.Arrays.copyOf
Который был добавлен в JDK 6 и общий метод, поэтому он может быть использован:
Integer[] is = new Integer[] { 4, 6 }
Integer[] copy = Arrays.copyOf(is, is.length);
Или это может сужать тип:
Number[] is = new Number[]{4, 5};
Integer[] copy = Arrays.copyOf(is, is.length, Integer[].class);
Заметьте, что вы можете также использовать метод clone
на массиве:
Number[] other = is.clone();
Вы хотите скопировать сам массив (т. Е. Ссылки в массиве) или же вы хотите клонировать все объекты, на которые ссылаются ссылки в массиве? – Jesper