• ベストアンサー

オブジェクトの比較と文字列の比較の違い

今、基本情報技術者の勉強でJavaを勉強しているのですが、持っているテキストの問題で分からないものがありました。 String str1 = "Hello."; String str2 = "Good, Bye."; String str3 = str1; String str4 = str1 + str2; とすると、 (A)str1 == str2; がfalse (B)str1.equals(str3); がtrue というのは分かるのですが、 (C)str4 == "Hello.Good, bye."; がなぜfalseになるのでしょうか? ==はオブジェクトの比較で、equlasは文字列の比較だと書いているのですが、よく違いが分かりません。 また、 上の4つの処理の後に str3 = "test"; という処理を行っているのですが、このときの状況は、 str1はHello.のままで、 str3のみがtestになっている、と理解したのですがそれで合っているのでしょうか?

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

Java は、オブジェクトの置き場所を仮想マシン(Java のシステム、位の理解で良いです)が 管理しています。オブジェクトの内容を書き込める分厚いノートがある、と想像して下さい。 Java で扱うオブジェクトは、全て「参照」です。そのノートのページ番号が「参照」である と理解して下さい。 > String str1 = "Hello."; これは、新しい1ページを見つけて、String のオブジェクトであることと、その内容が "Hello." である事を書き込んで、そのページ番号を str1 という変数に覚えておきます。 > String str3 = str1; これは、str1 に書いてあるページ番号を str3 に書き移していることになります。 "Hello." と書いてあるノートのページは、未だひとつしかありません。 > ==はオブジェクトの比較で、equlasは文字列の比較だと書いているのですが、よく違いが分かりません。 == は、(ここまでの喩えの)ページ番号の比較で、equals は、ページに書き込まれている内容の 比較になります。 > String str4 = str1 + str2; これは、str1 のページの内容と str2 のページの内容をくっつけたものを、新しいページを 探して、そこに書き込み、そこのページ番号を str4 に覚えておきます。 > (C)str4 == "Hello.Good, bye."; で、この式は、さっきのページ番号と、(新しくページを探して)"Hello.Good,bye" と書き込んだ ページの番号を比べていることになります。なので、ページ番号が違う、ということで false に なります。 > str3 = "test"; > という処理を行っているのですが、このときの状況は、 > > str1はHello.のままで、 > str3のみがtestになっている、と理解したのですがそれで合っているのでしょうか? 合ってます。 > str3 = "test"; は、新しいページを探して、"test" という内容を書き込んで、そのページ番号を str3 に 覚えておくことになります。"Hello." が書いてあるページ番号が消されてしまいますが、 そのページに対して何かを書いたり・消したりしているわけではないので、str1 に入っている ページ番号のページには "Hello." がそのまま残っています。 > str3のみがtestになっている と言うよりは、str3 が "test" という内容の String オブジェクトを「指している」と いう言い方が正確な表現になります。

fuyu
質問者

お礼

御礼が遅くなり申し訳ありません。 今回は回答ありがとうございました。 非常に分かりやすい説明で、==とequalsの 働きなどがイメージしやすく、理解が 深まったと思います。 ありがとうございました。

その他の回答 (1)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

"Hello" と "Hello" は同じでしょうか。 よく見て下さい。もちろん、文字列としては同じです。 けれども、書かれている場所が違います。最初のものは 左に、次のものは右に書かれています。 トンチクイズではありません。==による比較は、こんなこと まで比較するのです。ですから、例えばstr1もstr2も同じ 左側の"Hello"を指すとすれば、(str1==str2)はtrueです。 しかし、str1が左側の"Hello"を、str2が右側の"Hello"を 指すとすれば、(str1==str2)はfalseになってしまいます。 (str1.equals(str2)はtrueです。) ご質問のケースでは、str1+str2でStringオブジェクトが 作られていますが、(C)の右辺にある"Hello.Good, bye." は、それとは別の場所にあるのです。

fuyu
質問者

お礼

御礼が遅くなり申し訳ありません。 今回は、回答ありがとうございました。 おかげさまで理解できました。

関連するQ&A