OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 暇なときにでも
  • 質問No.163304
  • 閲覧数65
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 69% (145/210)

今、基本情報技術者の勉強で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になっている、と理解したのですがそれで合っているのでしょうか?
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル14

ベストアンサー率 50% (1122/2211)

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

お礼率 69% (145/210)

御礼が遅くなり申し訳ありません。
今回は回答ありがとうございました。
非常に分かりやすい説明で、==とequalsの
働きなどがイメージしやすく、理解が
深まったと思います。
ありがとうございました。
投稿日時 - 2001-11-06 15:07:39
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル13

ベストアンサー率 24% (357/1463)

"Hello" と "Hello" は同じでしょうか。 よく見て下さい。もちろん、文字列としては同じです。 けれども、書かれている場所が違います。最初のものは 左に、次のものは右に書かれています。 トンチクイズではありません。==による比較は、こんなこと まで比較するのです。ですから、例えばstr1もstr2も同じ 左側の"Hello" ...続きを読む
"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

お礼率 69% (145/210)

御礼が遅くなり申し訳ありません。

今回は、回答ありがとうございました。
おかげさまで理解できました。
投稿日時 - 2001-11-06 15:08:08


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ