• 締切済み

String定数プールと"==演算子"との関係。

String str1 = new String("str1"); String str2 = new String("str1"); String str3 = "str1"; if(str1 == str2){    System.out.println("same!"); } if(str1 == str3){    System.out.println("same!"); } 上記のコードで実行すると、"same!"が実行されません。 Stringオブジェクトには定数プールがあって、新たにStringオブジェクトが作成されたとき、定数プールに入っているそれまでに存在していたStringオブジェクトの値と同じであったら、新たにStringオブジェクトを作らず、それまでにあったStringオブジェクトの参照を当てるということなのです。 それに従えば、str2,str3はstr1と同じStringオブジェクトを参照しているはずだから、if文の結果はtrueになるはずなんですが、、、。 適切な回答をいただきたく思います。よろしくお願いいたします。

みんなの回答

  • azicyan
  • ベストアンサー率21% (368/1747)
回答No.4

>お書きになられたとおり、10日後に認定試験受ける予定なんで、とてもたすかりました! やはりそうですね!! どこかで見たような問題だと思いました! 普通の入門書にはあまり記述されていないけれど、 重要な部分ですね。 この問題は結構ややこしいのですが、 出題しやすいので、必ずでます。 例えば、 プリミティブ型を比較したり、 ラッパークラスを比較したり、 それこそStringを比較等々ですね。 引っ掛けで良くあるのが、 プリミティブ型をequals()で比較すると言う問題です。 equals()の引数にはプリミティブ型は取れないのでコンパイルエラーになります。 が、ラッパークラスであればequals()の引数にとることが出来ますね。 比較的得点しやすい問題なので、 きっちりおさえておきましょう。 僕でも受かったので大丈夫です(^O^) ファイト!です!!

すると、全ての回答が全文表示されます。
  • azicyan
  • ベストアンサー率21% (368/1747)
回答No.3

今試して見ました。 #1の方の解答が正しいです。 new とした場合には別オブジェクト、になるのですね。

すると、全ての回答が全文表示されます。
  • azicyan
  • ベストアンサー率21% (368/1747)
回答No.2

ちょっと自信がないのですが この場合 オブジェクト参照変数は3つ、 Stringオブジェクトは1つ、作られています。 つまりstr1とstr2は、 「箱の中身」は同じStringオブジェクトではありますが、 「同じ変数」ではありません。 「箱の中身」を比較したいときにはequals()、 「変数そのもの」を比較したいとき(プリミティブ型は箱の中身でもこちらになる)==をつかうのです。 参照先は同じでも、 equalS()であっても、==ではない、 と言うことになります。 SUNの認定試験で同じような問題が出ます。 私も意味がわからなくて混乱しました。

maiko_asu
質問者

お礼

なるほど!よく分かりました。ありがとうございます(^0^)! お書きになられたとおり、10日後に認定試験受ける予定なんで、とてもたすかりました!

すると、全ての回答が全文表示されます。
  • symgt
  • ベストアンサー率56% (68/120)
回答No.1

定数プールに同じ文字列が存在してもnewした場合は新しいオブジェクトが 作成されるのでstr1、str2、str3は別のオブジェクトになります。 String str1 = "str1"; String str2 = "str1"; String str3 = "str1"; とすればstr1、str2、str3は定数プールの"str1"オブジェクトを 参照することになり"same!"が表示されます。

maiko_asu
質問者

お礼

なるほど!よく分かりました。ありがとうございます(^0^)! no2にもお書きになられたとおり、10日後に認定試験受ける予定なんで、とてもたすかりました!

maiko_asu
質問者

補足

回答に対するお礼 no2にお書きになられた方は別の方でしたね。。 申し訳ないです。

すると、全ての回答が全文表示されます。

関連するQ&A