![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
質問させてください。
ネットを見ると、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メソッドはディープコピーなのでしょうか。
どなたか教えてください。お願いします。
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しないといけません。
No.4
- 回答日時:
この場合 shallow と deep は区別できないです。
何が shallow で何が deep か確認してみましょう。
No.3
- 回答日時:
こちらのサイトが参考になると思います。
http://my.reset.jp/~okera/java/java_tips/oop/sha …
シャローコピーとはいっても、ちゃんと別のオブジェクトが生成されます。
それと、cloneは基本的にシャローコピーになりますが、
基本型(int型等)のフィールドのコピーに関しては、ある意味ディープコピーになります。
これは参照型変数と基本型変数で、書きこまれる値の種類が違うからなのですが、
その点は大丈夫でしょうか。
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());
}
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*で正三角形を出力
-
論理演算子”||”またはの入力方法
-
ループ処理の際、最後だけ","を...
-
階乗の式
-
Ctrl+Zが入力されると終了する...
-
学校で課題を出されて困ってい...
-
JAVAのfor文で困っています。
-
countに実行した回数をいれたい...
-
パソコンキーボードで時分秒を...
-
javaのプログラミングで作るRPG...
-
複数のテキストボックスに同じ...
-
C言語のポインターに関する警告
-
プログラミングの問題です。大...
-
JSPやサーブレットでSystem.out...
-
IF関数でEmpty値を設定する方法。
-
C言語の変数(LSB)の合わせ込...
-
行列の表示
-
1~100までの数字を表示し、か...
-
privateなフィールドは継承され...
-
戻り値を使用する呼出
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ループ処理の際、最後だけ","を...
-
続・ZZZ,ZZZ,ZZ9形式の金額形式...
-
java キーボード入力された値の...
-
テキストボックスに入力された...
-
論理演算子”||”またはの入力方法
-
総称型ArrayList<E>への参照...
-
7つ数字を表示したら改行すると...
-
Ctrl+Zが入力されると終了する...
-
countに実行した回数をいれたい...
-
キーボードから10人分の点数を...
-
Java、2の0乗~10乗の表示
-
Randomメソッドの確率設定
-
数値⇒漢数字変換 java
-
コマンドライン引数の例外処理...
-
Java 入力した整数値の合計を、...
-
javaのエラーが回収できない
-
2つのスクロールバーを連動させ...
-
階乗の式
-
C#の質問
-
Java キーボードから負の数が入...
おすすめ情報