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