• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:equalsと==について)

equalsと==について

このQ&Aのポイント
  • equalsと==の違いを知りたい
  • 文字列の比較におけるequalsと==の使い方を教えてほしい
  • どちらが良いか、equalsと==の違いを教えてほしい

質問者が選んだベストアンサー

  • ベストアンサー
  • dayowl
  • ベストアンサー率56% (84/148)
回答No.2

a.put("c","1"); b.put("c","1"); これですと、a.get("c")でb.get("c")で得られるものは、結局同じオブジェクトなんではないでしょうか? HashMapをnewしても比較しているものは同じオブジェクトですよね? HashMap a = new HashMap(); HashMap b = new HashMap(); String value1 = new String("1"); String value2 = new String("1"); a.put("c",value1); b.put("c",value2); この場合 a.get("c") == b.get("c") がどういう結果になるかお試しください。

ratsbane
質問者

お礼

またあまたありがとうございます。 そうですよね、HashMapに入っているオブジェクトは同じですよね。 これから、dayowlさんのヤツを試そうと思いますが、 異なるオブジェクトなので、falseが返ると思います。 ありがとうございました。

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

その他の回答 (3)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.4

この問題はJava学習者を悩ますナンバーワンです(たぶん)。 StringリテラルがJavaの中で特殊な扱いをされているところに、 ややこしさの原因があります。 Stringは参照型なので、メモリ上にオブジェクトがあります。 参照型の比較において、==は「同じオブジェクトであるかどうか」を調べます。 普通の参照型なら、 ClassX a, b; a = new ClassX(); b = new ClassX(); としたとき、a == bはfalseを返します。 「別のところで作ったオブジェクトは別のものである」 というのが、通常の場合です。 ところがStringだけは、 「内容が同じものは、できるだけ同じものにしよう」 となってます。 (メモリを節約するために)JavaコンパイラとJava実行環境が、 同じものを実体としてまとめているのです。 だから String a = "abc"; String b = "abc"; としたときの実際の動作は、 実行環境がひとつのStringオブジェクト"abc"を生成して、 変数aとbはそれを参照しているのです。 しかしこの、同じ文字列をまとめる作用は、、 コンパイル時と実行開始時にしか働きません。 実行中に作られた文字列には適用されません。 たとえば、文字列 String a="Puppet"; String b="Muppet"; をa + bによってくっつけて新しい文字列を作ると、"PuppetMuppet"という文字列になりますが、 System.out.println((a + b) == "PuppetMuppet"); はfalseを表示します。 要するに、 「同じ内容の文字列は、コンパイラやJVMが、可能な限りまとめてくれる。 しかし実行時に生成される文字列はそうならない。」 ということです。 結論として、文字列比較はequals()を使うのが正しいやりかたです。

ratsbane
質問者

お礼

ありがとうございます。 わかりやすい回答で助かりました。 equalsを使うようにします。 というか、equalsを使うようにしてましたが、 「なぜ?」という疑問がありましたので、質問させていただきました。 協力してくださった皆様、本当にありがとうございました。

すると、全ての回答が全文表示されます。
  • jun-1
  • ベストアンサー率29% (18/61)
回答No.3

==はオブジェクトの参照(メモリアドレスへのポインタ)が同じで あるかどうかの演算子です。 また、#1さんが String a = "aaa"; String b = "aaa"; は同一のオブジェクト、と言われていますが、 確かにWindowsのJDKではその通りだと思いますが、 別プラットフォーム(組込み系など)のVMではそのような動きを しない場合があります。 ですので、文字列が同じであるかどうかの判定は equalsメソドを使うのが正しいと思います。

ratsbane
質問者

お礼

ありがとうございます。 使用してるのはWindowsです。 文字列はequalsを使った方が無難?ということですね?わかりました!

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

String a = "aaa"; String b = "aaa"; この記法を用いる場合では、「==」が使えます。 というのは、上記の記法の場合は、aもbも同一のオブジェクトに対する参照になります。 つまり"aaa"というオブジェクトへの参照がaとbにコピーされるわけです。 そして「==」は「同じオブジェクトかどうか」の評価を行いますからtrueが返ります。 しかしそれは、同じオブジェクトかどうかの比較結果であって、文字列の評価結果ではないです。 試しに、 String a = new String("aaa"); String b = new String("aaa"); とやると a==bはtrueになりません。 これは、a,bそれぞれに別なオブジェクトが生成されているためです。 equalsの場合は文字列を比較しますので、 上記どちらの定義の場合でも、trueが返されます。 ということで、文字列の比較にはequalsを用いたほうがよろしいかと思います。

ratsbane
質問者

お礼

ありがとうござます。 Stringをnewすると別のオブジェクトを参照するため、==ではfalseを返すことはわかりました。 続いて更に質問なんですが、 HashMap a; HashMap b;を共にnewして、 a.put("c","1"); b.put("c","1"); としたとき、 if(a.get("c") == b.get("c"))はtrueを 返しました。equalsもtrueでした。 これはa,bは違うオブジェクトなのに、なぜtrueを返すのでしょうか? 違うオブジェクトでもgetしたものは同じところを参照してるということなのでしょうか? 教えてください、お願いします。

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

関連するQ&A