今、基本情報技術者の勉強で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になっている、と理解したのですがそれで合っているのでしょうか?

このQ&Aに関連する最新のQ&A

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

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

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

"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

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

このQ&Aと関連する良く見られている質問

QString a = "a"; と String b = new String ("b"); の違い

String a = "a";
String b = new String ("b");

お伺いしたいのですが、
b は String のインスタンスを作ってると思いますが、
a はどんなことをしてるのでしょうか?

Aベストアンサー

お二人の回答を具体的に言うと、こういうことです。
String a1 = "a";
String a2 = "a";
String b1 = new String ("b");
String b2 = new String ("b");

a1のために、aという文字列のインスタンスが作られますが、
a2に代入されるのは、a1に使われたインスタンスが再利用されます。
これは、
if(a1 == a2) System.out.print("a1と同じインスタンス");
の結果でもわかります。

一方、b1とb2は、bという文字列オブジェクトを引数に、新しいインスタンスを生成する指示がありますので、b1とb2と、その初期化に使った無名のStringインスタンスの3つがメモリ上に存在することになります。
if(b1 != b2) System.out.print("b1とは違うインスタンス");
の結果でもわかると思います。

したがって、
String b = new String ("b"); というのは、Integerに例えると
Integer i = new Integer(new Integer(1)); という処理を
していることになり、ひとつ無駄なインスタンス生成となります。

お二人の回答を具体的に言うと、こういうことです。
String a1 = "a";
String a2 = "a";
String b1 = new String ("b");
String b2 = new String ("b");

a1のために、aという文字列のインスタンスが作られますが、
a2に代入されるのは、a1に使われたインスタンスが再利用されます。
これは、
if(a1 == a2) System.out.print("a1と同じインスタンス");
の結果でもわかります。

一方、b1とb2は、bという文字列オブジェクトを引数に、新しいインスタンスを生成する指示がありますので、b1とb2と、その...続きを読む

QString str = "a\\b\\c";

String str = "a\\b\\c";

という文字列があった時に、a,b,cで分割したいのですが、どのようにsplitさせれば出来るでしょうか?

Aベストアンサー

str.split("\\\\")
円マークを4つよ。

Q&= ~0x0c; &= ~0x03; |=1;

JavaScriptで分からないコードがあるので教えてください。


■変数設定
var hoge = 0;


■変数格納
・キーを押した時の条件分岐
  ~なら hoge |= 1;
  または hoge |= 2;
  または hoge |= 3;
  または hoge |= 8;

・キーを離した時の条件分岐
  ~なら hoge &= ~0x0c;
  または hoge &= ~0x03;


■変数使用
・swithch文の条件分岐に利用
  (hoge&0x03)
  (hoge&0x0c)


■質問
・どういう意味でしょうか?
・文字コード?
・ビット演算?

Aベストアンサー

ビット演算してるわね

x = x + a

x += a
って書くことができるの

つまり
hoge |= 1

hoge = hoge | 1
のことね

~はNOTのこと

0x
はアスキーコードの16進数表記ねきっと

0x0c は改ページを意味していて
0x03 は文章の最後を意味している
と思われるわ
全文がないので推測だけど

QString str = (String)url

classファイルでのアプレットで、自分のパスを編集しようと思っています。
自分のパスをgetCodeBase()で得て、文字列として認識させたいのだけど
それができていません。

String str;
str = getCodeBase().toString;

コンパイルエラー
シンボル: 変数 toString
位置 : java.net.URL の クラス
strBuf = getCodeBase().toString;

getCodeBase()はStringでなく、URL型を返すみたいです。
これを文字列のように編集したいからSrting型にしたいんだけど
どうすればいいんですか?

Aベストアンサー

もとのソースに()を付けるだけでOK。

String str=getCodeBase().toString();

便乗ですけど、先程の投稿の。。。

Event.ACTIONEVENT

は書き間違いです。

Event.ACTION_EVENT

が正しいので訂正させてもらいます。

QString s = ?(97);// get 'a'

String s = ?(97);
s.equals("a")にするための?の部分を教えてください。

Aベストアンサー

String s = String.valueOf((char)97);

1.2は確認できませんが、1.3では確認済。
要は数値でもcharにキャストすればOKです。(コードがUNICODEであることに注意)


人気Q&Aランキング

おすすめ情報