アプリ版:「スタンプのみでお礼する」機能のリリースについて

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件)

>何かの勘違いでは?



御免、array4[1]=5
で値を変えているのか。
それでは比較で false になるのは当然ですね。

で、
「そもそも array3[1] は int型で、int 型はプリミティブだから
「値」で比較されます。参照ではないから、参照の共有とか関係ないです。」

という指摘は変わらないです。

また仮に参照だとしても
array4[1]=5 で参照が変化しないと考えるのは変。
#pythonとかではint型も参照型だが参照は変化します。

「参照」の意味を取り違えているのでは?
    • good
    • 0

再現しないけど。



何かの勘違いでは?

以下 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の例のほうもプリミティブ型の比較だから参照の共有とか無関係。
    • good
    • 0

char そのものはプリミティブ型だけど char[] はオブジェクト型. で, char[][] は「個々の要素が char[] であるような配列 (オブジェクト)」だ.



あと「参照型は代入して==で結んでも結果はfalseでしたっけ?」の「代入」がどのような操作を意味するのかがわからんのだけど, 単純な = による「代入」のことであれば
A a = new A(), b;
b = a;
のあと a == b は true になる.

ということで, ここでの clone がシャローコピーであれば理解できる挙動になる.
    • good
    • 1

array1 (や array2) の要素はオブジェクトだから参照になっているけど, array3 (や array4) の要素は

オブジェクトじゃないので参照ではない.
    • good
    • 0
この回答へのお礼

ようするに
char型は参照型
intはプリミティブ型だから
結果が違うということですか?
私の認識ではchar型はプリミティブ型なのですが・・・
配列だから参照型になる感じですか?

参照型は代入して==で結んでも結果はfalseでしたっけ?

質問しててよくわからなくなってきました。
何がわからないのかが分からないです。

お礼日時:2024/01/11 22:42

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A