2009-09-02 5 views
8

Javaでは非プリミティブ型の配列をコピーするためにどのような方法がありますか?パフォーマンスの問題はどうですか?Java:非プリミティブ型の配列をコピーする

+0

配列自体(つまり、配列内の参照)のみをコピーするか、配列内の参照が指し示すすべてのオブジェクトも複製したいですか? – Jesper

答えて

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) 

この最初のものは、元の配列のタイプを使用してコピーを作成し、2つ目は、異なる配列型でコピーを行います。

arraycopyと3つの引数copyOfは、元の(ソース)配列内の各要素の型をターゲット配列型と照合する必要があることに注意してください。両方とも型の例外を投げることができます。 2つの引数copyOf(理論上は少なくとも)は型チェックを行う必要がないので、(理論上)より速くすべきです。実際には、相対的なパフォーマンスは実装に依存します。たとえば、arraycopyには、JVMによって特別な処理が施されることがよくあります。

+0

int [] array = {1、2、3};と思った人のために; int [] copy = Arrays.copyOf(array、array.length、Integer.class); 'コンパイルしません(_" Array型のcopyOf(int []、int)メソッドは引数には適用されませんint []、int、Class ) "_) –

14
System.arraycopy 

(あなたoffsetlengthパラメータを介してアレイの任意の部分をコピーする能力を与えます)。

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

注意をそれは使用することができますので、JDK 6で追加され、一般的な方法でありましたか

java.util.Arrays.copyOf 

配列上にcloneメソッドを使用してください。

Number[] other = is.clone(); 
+0

Touchéoxbow - 誰かが30分後に同じ答えで来て、受け入れられました! – pjp

+0

@pjp:私はスティーブンの答えを受け入れました。さらに、質問の演技部分にも取り組んでいました。 – desolat

+0

それはまったく問題ありません*なぜか* pjp *はとてもかわいいです! –

関連する問題