2009-09-02 1 views
8

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

+0

Вы хотите скопировать сам массив (т. Е. Ссылки в массиве) или же вы хотите клонировать все объекты, на которые ссылаются ссылки в массиве? – Jesper

ответ

7

Старая школа путь был:

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.

+0

Для тех, кто задавался вопросом 'int [] array = {1, 2, 3}; int [] copy = Arrays.copyOf (array, array.length, Integer.class); 'не будет компилироваться (_" Метод copyOf (int [], int) в типе Arrays не применим для аргументов (int [], int, класс ) "_) –

14
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(); 
+0

Touche oxbow - кто-то пришел через полчаса с тем же ответом и был принят! – pjp

+0

@pjp: Я принял ответ от Стивена, поскольку он дополнительно обратился к исполнительной части вопроса. – desolat

+0

Это не проблема * desolat * - не знаю, почему * pjp * настолько обидчив! –

 Смежные вопросы

  • Нет связанных вопросов^_^