
java silverの黒本にのっていた問題を一部抜粋して質問です。
問題文の一部抜粋
char[][]array1 ={{'a','b'},{'c','d'}};
char[][]array2 = array1.clone();
私が確認用に作った文
array2[1][1]='c';
System.out.println(array1[1][1]==array2[1][1]);
cloneメソッドは新しい配列を作りその配列に同じ要素への参照をコピーする。array1とarray2は同じ要素への参照を共有していることになり、array2の要素を変更するとarray1の参照も変更される。
だからtrueを戻す。
これは理解しました。
問題文の一部抜粋
int[]array3= {2,3,4};
int[]array4 = array3.clone();
私が確認用に作った文
array4[1]=5;
System.out.println(array3[1]==array4[1]);
しかし、次の問題で当然前の説明通り参照を共有しているのだからtrueだと思ったらfalseでした。
これは何故なのでしょうか?
説明には、同じ値を持った配列インスタンスが複製されるのでarray4の要素を変更してもarray3に影響を及ぼすことはありませんと書かれています。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
>何かの勘違いでは?
御免、array4[1]=5
で値を変えているのか。
それでは比較で false になるのは当然ですね。
で、
「そもそも array3[1] は int型で、int 型はプリミティブだから
「値」で比較されます。参照ではないから、参照の共有とか関係ないです。」
という指摘は変わらないです。
また仮に参照だとしても
array4[1]=5 で参照が変化しないと考えるのは変。
#pythonとかではint型も参照型だが参照は変化します。
「参照」の意味を取り違えているのでは?
No.3
- 回答日時:
再現しないけど。
何かの勘違いでは?
以下 openJDK 21 の JSHELL
C:\Users\tknakamuri>jshell
| JShellへようこそ -- バージョン21
| 概要については、次を入力してください: /help intro
jshell> int [] array3 = {2,3,4};
array3 ==> int[3] { 2, 3, 4 }
jshell> int [] array4 = array3.clone();
array4 ==> int[3] { 2, 3, 4 }
jshell> System.out.println(array3[1] == array4[1])
true
そもそも array3[1] は int型で、int 型はプリミティブだから
「値」で比較されます。参照ではないから、参照の共有とか関係ないです。
charの例のほうもプリミティブ型の比較だから参照の共有とか無関係。
No.2
- 回答日時:
char そのものはプリミティブ型だけど char[] はオブジェクト型. で, char[][] は「個々の要素が char[] であるような配列 (オブジェクト)」だ.
あと「参照型は代入して==で結んでも結果はfalseでしたっけ?」の「代入」がどのような操作を意味するのかがわからんのだけど, 単純な = による「代入」のことであれば
A a = new A(), b;
b = a;
のあと a == b は true になる.
ということで, ここでの clone がシャローコピーであれば理解できる挙動になる.
No.1
- 回答日時:
array1 (や array2) の要素はオブジェクトだから参照になっているけど, array3 (や array4) の要素は
オブジェクトじゃないので参照ではない.ようするに
char型は参照型
intはプリミティブ型だから
結果が違うということですか?
私の認識ではchar型はプリミティブ型なのですが・・・
配列だから参照型になる感じですか?
参照型は代入して==で結んでも結果はfalseでしたっけ?
質問しててよくわからなくなってきました。
何がわからないのかが分からないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/03/02 08:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/08 09:08
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- Visual Basic(VBA) VBAのフィルター操作 5 2023/08/08 09:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ArrayListからBean配列に値をセ...
-
配列で、値の入っている要素数...
-
配列をセッションに割り当てた後で
-
[Ljava.lang.Stringってなんですか
-
Javaで文字と数字が混ざったも...
-
この警告はどうすれば?
-
javamailで複数人にメールを送...
-
同じ配列またはクラスを、2回...
-
配列の中に複数存在する数がい...
-
C言語でunsigned char配列を連...
-
Byte配列をInputStreamに入れる...
-
javaプログラミング shuffleメ...
-
javaでの文字列からの数字抽出
-
javaで大容量テキストファイル...
-
forループの評価(条件)式につ...
-
hit&blow
-
ArrayListを使った多次元配列の...
-
Javaで文字を漢字であるか否か...
-
配列インデックス範囲外エラー?
-
2次元配列のコピー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javaで文字と数字が混ざったも...
-
フローチャート
-
この警告はどうすれば?
-
[Ljava.lang.Stringってなんですか
-
配列で、値の入っている要素数...
-
C#で動的配列Listの中身をListB...
-
配列の中に複数存在する数がい...
-
セッションを使ったint型の値の...
-
【C#】ハッシュテーブル(連想...
-
javaについて
-
javaでの文字列からの数字抽出
-
配列について
-
javaで大容量テキストファイル...
-
配列数を超えてアクセスしたと...
-
【Ajax通信&Java】配列の受け取...
-
『args[]』とは?
-
ArrayListからBean配列に値をセ...
-
C言語でunsigned char配列を連...
-
strutsで2次元配列をやりとりす...
-
javamailで複数人にメールを送...
おすすめ情報