7

注意: 文字が等しいかどうかを比較しようとしているわけではありません。String.equals() メソッドの使い方を知っているからです。この質問は文字列参照に関するものです

クラス String とそのプロパティについて学び始めたとき、OCA 試験の勉強をしていました。文字列プールについて読んだり理解したりしたことによると、文字列が作成されると、Java はこのオブジェクトを呼び出すものに格納するということです。文字列プールと同じ値で新しい文字列が作成された場合、文字列プールの文字列を参照しますが、両方の文字列に同じ値が含まれていても新しい参照が作成されるため、 newキーワードを使用する場合を除きます。

例えば:

String a = "foo";
String b = "foo";
String c = new String("foo");
boolean ab = (a == b); // This return true
boolean ac = (a == c); // This return false

このコードが何を作成しているかを明確にするために、コードの 1 行目で を作成し、String a = "foo"これをString プールに格納します。コードの 2 行目で、 を作成しString b、参照を作成します。"foo"これは、既にString プールに存在するためです。ただし、3 行目は、この文字列が既に存在するかどうかに関係なく、この文字列の新しい参照を作成します。何が起こっているかについての小さなグラフィックの例を次に示します。 http://cdn.journaldev.com/wp-content/uploads/2012/11/String-Pool-Java1.png

問題は、次のコード行で発生します。文字列が連結によって作成された場合、Java は別のものを作成しますか、または単純な == コンパレーターは別の動作をしますか?

例 A:

String a = "hello" + " world!";
String b = "hello world!";
boolean compare = (a == b); // This return true

例 B:

a = "hello";
b = "hel" + "lo";
compare = (a == b); // This return true

例 C:

a = "Bye";
a += " bye!";
b = "Bye bye!";
compare = (a == b); // This return false

コードの実行を見るには: ( http://ideone.com/fdk6KL )

何が起こっている ?

編集

  1. 例 B のエラーを修正:b = 'hel' + 'lo'

  2. 問題についての説明を追加します。String.equals()これは比較の問題ではありません。問題の使用が文字列プールの参照にあることを知っているからです。

4

2 に答える 2