質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

2回答

696閲覧

Java Silverの問題を教えてください

mmmmmm

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2022/11/23 06:20

編集2022/11/23 06:35

Java Silverの問題で分からない箇所があるので教えてください。

イメージ説明
イメージ説明

写真の問題の7行目は、4行目のプール内の文字列str2を参照すると答えに書かれています。7行目はstr1==str3なので3行目と5行目のstr1とstr3を見るのだと思っていました。なぜstr1==str3なのにstr2を参照してるか見るんですか?
また、8行目がどのようになるかも教えてほしいです。

よろしくお願い致します。

解答です。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2022/11/23 06:25

Stringの比較が==な時点で結果は見えてると思います。 ただ、実際のコードを書いて実行してみては。 BronzeでもSilverでもGoldでも問題集や参考書読んでるだけでは身に付きませんし、意味ないかと。
Zuishin

2022/11/23 06:32

別の解答を見ているのでは?
mmmmmm

2022/11/23 06:36

見てる解答は合ってます。解答の写真も追加しました。
Zuishin

2022/11/23 06:48

4 行目が終わった時点で str1 と str2 は別の場所を指します。 ただし str2 は定数なので文字列プールに入れられ、次回同じ文字列がリテラルで参照された場合、新しく文字列を作るのではなく、プール内の既存の文字列が返されます。 intern は文字列をプールに入れるメソッドであり、プールの中に既に同じ文字列がある場合にはそれを返します。 ここで str2 が既にあるので、str3 にはプール内の str2 が返され、同じ参照を指します。 == は文字列の値ではなく参照が同じかどうかを判定するもので、この場合 str2 と str3 がプール内の同じものなので true になります。 str1 は new で作ったもので、その参照は自動更新されないため、違うものになります。
jimbe

2022/11/23 07:56 編集

全部解答で解説されているようですが。 「オブジェクトを指す変数」と「オブジェクト自体」とを区別出来る必要があります。
BeatStar

2022/12/02 23:51

解決したのならベストアンサーを決めるか「自己解決」をしてください。
guest

回答2

0

7行目は、4行目のプール内の文字列str2を参照すると答えに書かれています。

それは正確ではありません。『プール内の文字列(str2 が参照している文字列)を参照』です。
5 行目まで実行した結果は(解答の説明によれば)以下のようになります。

各変数が参照する図

矢印が "参照" です。
"==" が "参照先が同じか" を返す時、各変数同士の比較がどうなるのかは読み取れるのでは無いでしょうか。

投稿2022/11/23 17:18

編集2022/11/24 05:31
jimbe

総合スコア12659

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ハッシュコード値を調べる

System#identityHashcodeを使ってStringオブジェクト本来のハッシュコード値を見ることができます。

Java

1 String str1 = new String("Java"); 2 String str2 = "Java"; 3 String str3 = str1.intern(); 4 5 System.out.println("str1 : "+System.identityHashCode(str1)); 6 System.out.println("str2 : "+System.identityHashCode(str2)); 7 System.out.println("str3 : "+System.identityHashCode(str3));

文字列リテラルはJVMでintern()されている

文字列リテラルは以下の等式が成り立ちます。

Java

1 System.out.println("Java" == "Java"); 2 System.out.println("Java".intern() == "Java"); 3 System.out.println("Java" == "Java".intern());

新しくStringオブジェクトを作成する

Stringを生成すると、どれも文字列リテラルとは異なるインスタンスが作成されます。

Java

1 System.out.println(new String("Java") == "Java"); 2 System.out.println(new String(new char[] {'J','a','v','a'}) == "Java"); 3 System.out.println(" Java ".trim() == "Java");

しかしintern()すれば、文字列リテラルと同じインスタンスになります。出題されているのは1番目のケースです。

Java

1 System.out.println(new String("Java").intern() == "Java"); 2 System.out.println(new String(new char[] {'J','a','v','a'}).intern() == "Java"); 3 System.out.println(" Java ".trim().intern() == "Java");

文字列リテラルの結合だけは、コンパイル時に結合されて常に同じインスタンスになります。 この出題はないと思いますが、いかがですか。

Java

1 System.out.println(("Ja" + "va") == "Java"); 2 System.out.println(("Ja" + "va").intern() == "Java");

インスタンスが文字列プールに登録されるのはいつか(追記)

最初にインスタンスが文字列プールへ登録されるのはどのタイミングですか。

  • 最初にString.intern()したとき
  • 最初に文字列リテラルを使ったとき

Java

1 String str1 = new String(new char[] {'J','a','v','a'}); 2 String str3 = str1.intern(); 3 String str2 = "Java";

このような出題 もないと思います。

投稿2022/11/23 22:01

編集2022/11/24 11:44
xebme

総合スコア1083

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/11/24 05:28 編集

>System#identityHashcodeを使って参照(32ビットの整数)を見ることができます。 identityHashcode は参照で無くハッシュコード値であって、 Object.hashcode と同じ要件ではないでしょうか。 資格試験の勉強中であれば参照とハッシュコード値は区別出来ていた方が良いように思います。 System.identityHashcode https://docs.oracle.com/javase/jp/15/docs/api/java.base/java/lang/System.html#identityHashCode(java.lang.Object) Object.hashcode https://docs.oracle.com/javase/jp/15/docs/api/java.base/java/lang/Object.html#hashCode()
xebme

2022/11/24 11:15 編集

jimbeさん >identityHashcode は参照で無くハッシュコード値であって、 Object.hashcode ... おっしゃるとおり、参照とハッシュコード値は同じではありません。訂正します。 > identityHashcode はObject.hashcode と同じ おっしゃるとおり。しかし、Object.hashcodeはString.hashcodeでオーバーライドされていて、文字列が同じなら全て同じハッシュコード値になります。internされた時、インスタンスが入れ替わったことを調べるのにidentityHashcodeを使いました。 また、 identityHashcode はハッシュコード値ゆえに理論的にはユニークでない可能性があります。コード例は、実質ユニークとみなして使っています。
xebme

2022/11/24 11:46

文字列プールへの登録タイミングを追記しました。ぜひ調べてみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問