「==」と「equalsメソッド」の罠

現在、絶賛Java bronzeの資格を勉強中です。

勉強中に理解不能だったタイトルにも書いた内容をAI君に聞いてみました。

個人的にStringの比較で ?? となっていたので参考書の練習問題で間違えまくってしまいました。

それでは確認してみましょう。

まずStringのインスタンス化を行います。これは通常の変数宣言と違い、new String()の部分によってstr1str2という異なるオブジェクトが生成されています。

一応中身はどちらのオブジェクトにも“Hello”という同じ文字列を渡しております。

今回はif文で条件分岐してもらいます。比較演算子である「==」と「equalsメソッド」を使って2パターン比較しております。

同じ文字列を渡しておりますが果たしてどうなるでしょうか。

結果が出ました。

単純な比較演算子「==」ではfalse、「equalsメソッド」ではtrueとなりました。

オブジェクトを生成した段階でstr1str2は別のオブジェクト(モノ)として作られ、それを「==」で比較するので

システムからすると別のモノですよ~と教えてくれてるんですね。

オブジェクトの中身を比較したいんだ!同じものを入れたはずなのに!!という場合は

「equalsメソッド」を使えば比較してあげますよ~というイメージでしょうか。

ちなみにこれは例外的なケースみたいです。研修の時はよく使いましたが。

なんでそもそも私が ?? になってたかというと

↓↓↓↓↓↓

これの実行結果が

これになるからですね。

こっちはどっちもtrueなんかい!と。

覚え方が悪かったです。String型で参照型だから「==」だと変数名で比較するんやろ!と単細胞みたいな覚え方をしていました。涙

これについてはなんでtrueになるかというと

「==」のほうは”name”がリテラルになるため、文字列プールという場所に保管される→同じリテラル(“name”)を使うときは変数名に関わらず文字列プールの同じ参照が再利用されるのでcとdは変数名は違えど同じオブジェクトを参照しているのでtrueとなるとのこと。。。

いやわかるか!!!!

やっとこの解説を見て理解できましたが。。。

「equalsメソッド」に関しては認識通り内容の比較になるのでtureとのことですね。

・オブジェクトの比較の際は「==」だとオブジェクトの比較。「equalsメソッド」だと中身の比較

・単なる変数の比較の際は「==」で比較可能。

コメント

タイトルとURLをコピーしました