プロが教える店舗&オフィスのセキュリティ対策術

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になるはずなんですが、、、。

適切な回答をいただきたく思います。よろしくお願いいたします。

A 回答 (4件)

>お書きになられたとおり、10日後に認定試験受ける予定なんで、とてもたすかりました!



やはりそうですね!!
どこかで見たような問題だと思いました!
普通の入門書にはあまり記述されていないけれど、
重要な部分ですね。

この問題は結構ややこしいのですが、
出題しやすいので、必ずでます。
例えば、
プリミティブ型を比較したり、
ラッパークラスを比較したり、
それこそStringを比較等々ですね。

引っ掛けで良くあるのが、
プリミティブ型をequals()で比較すると言う問題です。
equals()の引数にはプリミティブ型は取れないのでコンパイルエラーになります。
が、ラッパークラスであればequals()の引数にとることが出来ますね。

比較的得点しやすい問題なので、
きっちりおさえておきましょう。

僕でも受かったので大丈夫です(^O^)
ファイト!です!!
    • good
    • 0

今試して見ました。


#1の方の解答が正しいです。
new とした場合には別オブジェクト、になるのですね。
    • good
    • 0

ちょっと自信がないのですが


この場合
オブジェクト参照変数は3つ、
Stringオブジェクトは1つ、作られています。
つまりstr1とstr2は、
「箱の中身」は同じStringオブジェクトではありますが、
「同じ変数」ではありません。
「箱の中身」を比較したいときにはequals()、
「変数そのもの」を比較したいとき(プリミティブ型は箱の中身でもこちらになる)==をつかうのです。
参照先は同じでも、
equalS()であっても、==ではない、
と言うことになります。

SUNの認定試験で同じような問題が出ます。
私も意味がわからなくて混乱しました。
    • good
    • 0
この回答へのお礼

なるほど!よく分かりました。ありがとうございます(^0^)!

お書きになられたとおり、10日後に認定試験受ける予定なんで、とてもたすかりました!

お礼日時:2004/04/26 02:53

定数プールに同じ文字列が存在してもnewした場合は新しいオブジェクトが


作成されるのでstr1、str2、str3は別のオブジェクトになります。

String str1 = "str1";
String str2 = "str1";
String str3 = "str1";

とすればstr1、str2、str3は定数プールの"str1"オブジェクトを
参照することになり"same!"が表示されます。

この回答への補足

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

補足日時:2004/04/26 02:54
    • good
    • 0
この回答へのお礼

なるほど!よく分かりました。ありがとうございます(^0^)!

no2にもお書きになられたとおり、10日後に認定試験受ける予定なんで、とてもたすかりました!

お礼日時:2004/04/26 02:52

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