FC2ブログ
HOME   »  スポンサー広告  »  スポンサーサイト   »  Java  »  [Java]cloneメソッドによる配列のコピー

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Java]cloneメソッドによる配列のコピー

cloneメソッドを使用した配列のコピーについて。

○要素が基本型の場合
public class Main {
    public static void main(String[] args) {
        int[] srcArray = {0, 1, 2, 3, 4};
        int[] dstArray = srcArray.clone();
        if (srcArray == dstArray) {
            System.out.println("srcArray == dstArray");
        } else {
            System.out.println("srcArray != dstArray");
        }
        if (Arrays.equals(srcArray, dstArray)) {
            System.out.println("srcArray equals dstArray");
        } else {
            System.out.println("srcArray not equals dstArray");
        }
        dstArray[0] = 9;
        for (int i = 0; i < srcArray.length; i++) {
            System.out.println("srcArray[" + i + "] = " + srcArray[i] + "   " + "dstArray[" + i + "] = " + dstArray[i]);
        }
    }
}
3行目でint配列srcArrayを生成し、4行目でcloneメソッドを使用してint配列dstArrayにコピー。
5行目でsrcArrayとdstArrayが同一インスタンスかどうかを判定し、10行目でsrcArrayとdstArrayの内容が同じかどうかを判定。
15行目でdstArrayの0番目の要素の値を変更。

上記の実行結果は以下の通り。


srcArray != dstArray
srcArray equals dstArray
srcArray[0] = 0 dstArray[0] = 9
srcArray[1] = 1 dstArray[1] = 1
srcArray[2] = 2 dstArray[2] = 2
srcArray[3] = 3 dstArray[3] = 3
srcArray[4] = 4 dstArray[4] = 4


比較演算子==による比較結果はfalse(同一インスタンスではない)、コピー先の要素変更がコピー元の要素に反映されていないので、完全なディープコピーとなっている。

○要素が参照型の場合
まず、以下の様なクラスを作成する。
public class Hoge {
    public int number;
	
    public Hoge(int value) {
        number = value;
    }
}
そして、上記のHogeクラスを下記の様に使用してみる。
public class Main {
    public static void main(String[] args) {
        Hoge[] srcArray = new Hoge[5];
        for (int i = 0; i < srcArray.length; i++) {
            srcArray[i] = new Hoge(i);
        }
        Hoge[] dstArray = srcArray.clone();
        if (srcArray == dstArray) {
            System.out.println("srcArray == dstArray");
        } else {
            System.out.println("srcArray != dstArray");
        }
        if (Arrays.equals(srcArray, dstArray)) {
            System.out.println("srcArray equals dstArray");
        } else {
            System.out.println("srcArray not equals dstArray");
        }
        dstArray[0].number = 9;
        for (int i = 0; i < srcArray.length; i++) {
            System.out.println("srcArray[" + i + "].number = " + srcArray[i].number + "   " + "dstArray[" + i + "].number = " + dstArray[i].number);
        }
    }
}
3行目から6行目でHogeクラスの配列srcArrayを生成し、7行目でcloneメソッドを使用してHogeクラスの配列dstArrayにコピー。
8行目でsrcArrayとdstArrayが同一インスタンスかどうかを判定し、13行目でsrcArrayとdstArrayの内容が同じかどうかを判定。
18行目でdstArrayの0番目の要素のフィールド変数の値を変更。

上記の実行結果は以下の通り。


srcArray != dstArray
srcArray equals dstArray
srcArray[0].number = 9 dstArray[0].number = 9
srcArray[1].number = 1 dstArray[1].number = 1
srcArray[2].number = 2 dstArray[2].number = 2
srcArray[3].number = 3 dstArray[3].number = 3
srcArray[4].number = 4 dstArray[4].number = 4


比較演算子==による比較結果はfalse(同一インスタンスではない)、コピー先の要素変更がコピー元の要素に反映されているので、配列そのものはディープコピーだが要素はシャローコピーとなっている。


関連記事
Comment
Trackback
Trackback URL
Comment Form
管理者にだけ表示を許可する
プロフィール

まさお

Author:まさお
プログラミングは趣味レベルなので、お手柔らかに。

ブログランキング
ブログランキング参加中。是非クリックお願いします。


にほんブログ村 IT技術ブログ Androidアプリ開発へ

人気ブログランキングへ

ブログランキング



ブログ王

ブログランキング【ブログの惑星】

プログラム人気ブログランキング
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。