プロが教えるわが家の防犯対策術!

今、基本情報技術者の勉強で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 回答 (2件)

"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."
は、それとは別の場所にあるのです。
    • good
    • 0
この回答へのお礼

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

今回は、回答ありがとうございました。
おかげさまで理解できました。

お礼日時:2001/11/06 15:08

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 オブジェクトを「指している」と
いう言い方が正確な表現になります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/11/06 15:07

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