2009-09-02 66 views
8

在Java中复制非初始类型数组的首选方法是什么?性能问题如何?Java:复制非原始类型数组

+0

您是否只想复制数组本身(即数组中的引用),还是还想克隆数组中引用指向的所有对象? – Jesper 2009-09-02 07:47:03

回答

7

老学校的方式是:

public static void java.lang.System.arraycopy(Object src, int srcPos, 
     Object dest, int destPos, int length) 

这从一个现有的阵列到另一个copys。您必须自己分配新阵列...假设您正在制作副本阵列。

从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)不适用于参数int [],int,类)“_) – 2014-04-10 19:21:18

14
System.arraycopy 

(它给你经由offsetlength参数复制的阵列的任意部分的能力)。或者是在JDK 6加入,是一个通用的方法,因此可以被用来

java.util.Arrays.copyOf 

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

Touché牛仔 - 半小时后,有人来了相同的答案,并被接受! – pjp 2009-09-02 08:27:41

+0

@pjp:我接受了斯蒂芬的回答,因为他还提到了问题的表现部分。 – desolat 2009-09-02 08:38:58

+0

完全没问题* desolat * - 不知道为什么* pjp *太敏感了! – 2009-09-02 09:08:53