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

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

2 ответов


старый школьный способ был:

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.


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