Javaで配列コピー

ねたって難しいね。書くことがあんまり思いつかない(笑。

というわけで、今日はJavaの配列コピーのお話。


Javaで配列コピーをしようとするときのコードは、ぱっと思いつく範囲で3パターン。

その1:普通にfor文使う方法

public static Integer [] copy(Integer [] src){
    Integer [] result = new Integer[src.length];
    for(int i = 0; i < src.length; i++){
        result[i] = src[i];
    }
    return result;

その2:System.arraycopyを使う方法

public static Integer [] copy(Integer [] src){
    Integer [] result = new Integer[src.length];
    System.arraycopy(src, 0, result, 0, result.length);
    return result;
}

その3:cloneを使う方法

// Java 1.4以前の場合:
public static Integer [] copy(Integer [] src){
    return (Integer [])src.clone();
}

// Java 5.0の場合:
public static Integer [] copy(Integer [] src){
    return src.clone();
}

その1はJava始めたての人向けで、APIをちゃんと見れるようになるその2かその3。Java5.0だとその3が綺麗な気がする。ってか、むしろstatic methodなんかにしねぇな。

でまぁ、どれが早いのか前から疑問だったので、実験してみました。WinXPPenM 1.7G、Java 1.5.0_06で、1000000の長さのnull配列をコピーしてみた結果。1000回回して平均取ってみました。直前でSystem.gc呼んでなるべく途中でgcが動かないように注意してみた。

その1:32.47156441[ms]
その2:24.838845982[ms]
その3:31.362673201[ms]

どうやらその2が一番速いらしいです。ちょこちょこ書く分には気にしなくてもいいレベルだけど。すーごい重い計算とか、データが大量にあるときとかは、要注意・・・かな?