Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
  • ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:cloneメソッドはシャローコピー?)

cloneメソッドはディープコピーなのか?

このQ&Aのポイント
  • cloneメソッドは配列のシャローコピーを行うものと考えられがちですが、実際にはディープコピーを行っています。
  • 上記のコードを実行すると、配列cnum[0]とnum[0]の値が異なる結果になります。
  • したがって、cloneメソッドはディープコピーを行っており、配列の要素がコピーされることを示しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4910/10378)
回答No.2

[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しないといけません。

ryu-e
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.4

この場合 shallow と deep は区別できないです。 何が shallow で何が deep か確認してみましょう。

ryu-e
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.3

こちらのサイトが参考になると思います。 http://my.reset.jp/~okera/java/java_tips/oop/shallow_deep/shallow_deep.html シャローコピーとはいっても、ちゃんと別のオブジェクトが生成されます。 それと、cloneは基本的にシャローコピーになりますが、 基本型(int型等)のフィールドのコピーに関しては、ある意味ディープコピーになります。 これは参照型変数と基本型変数で、書きこまれる値の種類が違うからなのですが、 その点は大丈夫でしょうか。

ryu-e
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんにちは。  投稿されたサンプルコードはシャローコピーをしているので、別におかしくないですよ。  例で言うならこんな感じの方が適切だと思います。  ↓シャローコピーでうまくいかない例。 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());     }   } }

ryu-e
質問者

お礼

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

すると、全ての回答が全文表示されます。

関連するQ&A