今日のJavaの授業の終わりかけに、ちょっと困ったことが発生しました。 それは「Ifによる判断が、合っているはずなのに合わない」こと。 確かに、文字列一致の判断を行うために「==」で処理してるのになぁと、 しばらくソースを見直して、首をかしげてまた見直して・・・の繰り返し。 その時に、先生の一言でパッとみんな解けたわけですね。 「文字列一致の判断は、==ではなくてequals()。」 あぁなるほどな、と。ということで、下にまとめます。 今回はこちらのサイトを参考にさせていただきました。 Javaにおける文字/文字列の扱い方 - ITアーキテクト [IT Architect] 上リンクにあることをさっぱり書くと、 「==」は「同オブジェクト参照チェック」で、 「equals()」は「同格納値チェック」です。 「==」は、他言語と動作(というか判断基準)が違うので、注意が必要です。この場合は、a1,b1共に「同じ値」が代入されているにもかかわらず、 Javaの判断としては、「違うオブジェクトを参照」している、と取られます。 その結果、「同じオブジェクトを参照しているか」チェックする「==」はFalse、 「同じ値かどうか」チェックする「equals()」はTrueとなります。01.
// それぞれに同じ"初期値"を与えた場合
02.
String a1 =
new
String(
"abc"
);
03.
String b1 =
new
String(
"abc"
);
04.
System.out.println(
"それぞれに同じ\"初期値\"を与えた場合"
);
05.
06.
// == の場合
07.
if
( a1 == b1 ) {
08.
System.out.println(
"◆==:True"
);
09.
}
else
{
10.
System.out.println(
"◆==:False"
);
11.
}
12.
13.
// equals() の場合
14.
if
( a1.equals( b1 ) ) {
15.
System.out.println(
"◆equals():True"
);
16.
}
else
{
17.
System.out.println(
"◆equals():True"
);
18.
}
19.
20.
// **********************
21.
// * 実行結果
22.
//
23.
// それぞれに同じ"初期値"を与えた場合
24.
// ◆==:False
25.
// ◆equals():True
26.
// **********************
このソースの場合、x1,y1は同じxyを参照しています。 よって、「==」でも「equals()」でもTrueが返されます。 今後かなり多用すると思うので、憶えておかないとですね。01.
// それぞれに同じ"オブジェクト"を与えた場合
02.
String xy =
new
String(
"xyz"
);
03.
String x1 = xy;
04.
String y1 = xy;
05.
System.out.println(
"それぞれに同じ\"オブジェクト\"を与えた場合"
);
06.
07.
// == の場合
08.
if
( x1 == y1 ) {
09.
System.out.println(
"◆==:True"
);
10.
}
else
{
11.
System.out.println(
"◆==:False"
);
12.
}
13.
// equals() の場合
14.
if
( x1.equals( y1 ) ) {
15.
System.out.println(
"◆equals():True"
);
16.
}
else
{
17.
System.out.println(
"◆equals():True"
);
18.
}
19.
20.
// **********************
21.
// * 実行結果
22.
//
23.
// それぞれに同じ"オブジェクト"を与えた場合
24.
// ◆==:True
25.
// ◆equals():True
26.
// **********************
ホーム > ソース > Java ==とequals()による初歩的問題について
0 件のコメント:
コメントを投稿