電子書籍の厳選無料作品が豊富!

質問させてください。

ネットを見ると、cloneメソッドはシャローコピーをするものだと認識できます。
しかし、以下のコードを実行すると、配列cnum[0]とnum[0]の値が異なる結果になり、ディープコピーを行っているように見えます。

public class Hairetu {
public static void main(String[] args) {
int []num={1,2,3};
int []cnum=new int[3];
int []dnum=new int[3];

cnum=num.clone();
cnum[0]=12;

for(int i=0;i<3;i++)
{
System.out.println(cnum[i]+" "+num[i]);
}
}
}

cloneメソッドはディープコピーなのでしょうか。
どなたか教えてください。お願いします。

A 回答 (4件)

[1,2,3] のシャローコピーができるので、また別の[1,2,3]ができます。

配列としては別物。別々の配列を見ているので、一方の一部を変更しても他方に影響しません。

cnum=num.clone();
をcloneを使わずに書くと、
cnum=new int[num.size()];
for(var i=0; i<num.size(); i++) { cnum[i] = num[i]; }
です。

これが、int じゃなくてオブジェクト(たとえばString)だと、変数名はそのまま使うとして、
cnum = new String[num.size()];
for(var i=0; i<num.size(); i++) { cnum[i] = num[i]; } だとシャローコピー
for(var i=0; i<num.size(); i++) { cnum[i] = num[i].clone(); } だとディープコピー(*1)

intだとcloneできないのでディープコピーはありえないわけです。

(*1) Stringだとこれでディープコピーですが、対象のクラスがオブジェクト型のプロパティを持つ場合は単にcloneするだけじゃだめで再帰的にプロパティについてもcloneしないといけません。
    • good
    • 0
この回答へのお礼

使用している変数が悪かったのですね。勉強になりました。
ありがとうございます。

お礼日時:2011/07/22 19:07

この場合 shallow と deep は区別できないです。


何が shallow で何が deep か確認してみましょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。
勉強しなおしてきます。

お礼日時:2011/07/22 19:07

こちらのサイトが参考になると思います。


http://my.reset.jp/~okera/java/java_tips/oop/sha …
シャローコピーとはいっても、ちゃんと別のオブジェクトが生成されます。

それと、cloneは基本的にシャローコピーになりますが、
基本型(int型等)のフィールドのコピーに関しては、ある意味ディープコピーになります。
これは参照型変数と基本型変数で、書きこまれる値の種類が違うからなのですが、
その点は大丈夫でしょうか。
    • good
    • 0
この回答へのお礼

使用している変数が悪かったのですね。勉強になりました。
ありがとうございます。

お礼日時:2011/07/22 19:06

 こんにちは。



 投稿されたサンプルコードはシャローコピーをしているので、別におかしくないですよ。

 例で言うならこんな感じの方が適切だと思います。
 ↓シャローコピーでうまくいかない例。

public class Hairetu {
  public static void main(String[] args) {
    Point[] p = {new Point(0, 0), new Point(1, 1), new Point(2, 2)};
    Point[] p1 = new Point[3];

    p1 = p.clone();
    p1[0].x = 5;
    p1[0].y = 5;

    for (int i = 0; i < 3; i++) {
      System.out.println(p1[i].toString() + " " + p[i].toString());
    }
  }
}
    • good
    • 0
この回答へのお礼

ありがとうございます。
特に問題はないのですか・・・。

お礼日時:2011/07/22 19:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!