今、基本情報技術者の勉強で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になっている、と理解したのですがそれで合っているのでしょうか?
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."
は、それとは別の場所にあるのです。
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 オブジェクトを「指している」と
いう言い方が正確な表現になります。
御礼が遅くなり申し訳ありません。
今回は回答ありがとうございました。
非常に分かりやすい説明で、==とequalsの
働きなどがイメージしやすく、理解が
深まったと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Worksheet_Change 4 2023/03/12 21:54
- Visual Basic(VBA) VBAで時間(00:00形式)を積算(足し算)したい 1 2022/11/15 17:04
- Visual Basic(VBA) ワークシートチェンジで曜日を表示する方法 1 2023/03/04 21:51
- 放射線治療・リハビリテーション リハビリ系のお仕事についてです。 将来、リハビリ系のお仕事につきたいと思っているのですが PT、OT 1 2022/05/21 20:31
- Visual Basic(VBA) countifsについての質問 3 2023/03/08 13:45
- 電車・路線・地下鉄 初台→新宿3→代官山(7.6km)IC528円 笹塚→新宿3→中目黒(10.2Km)IC433円なぜ 5 2022/11/24 09:26
- 数学 領域の問題について質問です。 実数s, tは,s^2+t^2≦1, s≧0, t≧0 を同時に満たし 3 2023/05/18 20:59
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
- FTTH・光回線 ビッグローブ光とルーターの相性 2 2023/03/18 19:44
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
ワイルドカード<?>と型パラメー...
-
EXCEL VBAにて動的にCheckBOXを...
-
ASP.net 教えてください!!(...
-
Object型からDouble型へのキャスト
-
VBAでvlookup関数から、別シー...
-
C#でフォームのオブジェクト名...
-
VBA 同じ名前のオブジェクトを...
-
vb.net オブジェクト指向につい...
-
オブジェクトとコントロールっ...
-
時間帯判定をする。
-
VBScriptで計算して出た値をク...
-
access2002のリレーションシッ...
-
Javaで画像パスからImageIconオ...
-
多人数のじゃんけんプログラム
-
VBAからノーツを起動
-
オブジェクト名をforループ内で...
-
JqueryとPrototypeの比較
-
C++でのクラスオブジェクトの破棄
-
Vbで通常使用するプリンターを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
ワイルドカード<?>と型パラメー...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBAのWindowオブジェクトとWork...
-
C#でフォームのオブジェクト名...
-
LISTBOXの内容が更新されま...
-
Object型からDouble型へのキャスト
-
JAVAからHTMLへ値を返す方法
-
COMコンポーネントって何?
-
ビジュアルC++でボタンの有...
-
戻り値がクラスオブジェクト
-
VBA 同じ名前のオブジェクトを...
-
ASP.net 教えてください!!(...
-
Vbで通常使用するプリンターを...
-
newは明示的にした方が良いのか?
-
CoCreateInstanceでエラーになる。
-
オブジェクトレベルとメタレベル
-
bmp画像をjpegやpng画像に圧縮...
-
Accessの連結・非連結オブジェ...
おすすめ情報