2009-09-02 64 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