Java: скопировать массив не-примитивного типа

Каков предпочтительный способ копирования массива типа non-primitve в Java? Как насчет проблем с производительностью?

Ответ 1

Старый школьный путь:

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.

Ответ 2

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();