2009年9月17日木曜日

Java ==とequals()による初歩的問題について

今日のJavaの授業の終わりかけに、ちょっと困ったことが発生しました。 それは「Ifによる判断が、合っているはずなのに合わない」こと。 確かに、文字列一致の判断を行うために「==」で処理してるのになぁと、 しばらくソースを見直して、首をかしげてまた見直して・・・の繰り返し。 その時に、先生の一言でパッとみんな解けたわけですね。 「文字列一致の判断は、==ではなくてequals()。」 あぁなるほどな、と。
ということで、下にまとめます。 今回はこちらのサイトを参考にさせていただきました。 Javaにおける文字/文字列の扱い方 - ITアーキテクト [IT Architect] 上リンクにあることをさっぱり書くと、 「==」は「同オブジェクト参照チェック」で、 「equals()」は「同格納値チェック」です。 「==」は、他言語と動作(というか判断基準)が違うので、注意が必要です。
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.// **********************
この場合は、a1,b1共に「同じ値」が代入されているにもかかわらず、 Javaの判断としては、「違うオブジェクトを参照」している、と取られます。 その結果、「同じオブジェクトを参照しているか」チェックする「==」はFalse、 「同じ値かどうか」チェックする「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.// **********************
このソースの場合、x1,y1は同じxyを参照しています。 よって、「==」でも「equals()」でもTrueが返されます。 今後かなり多用すると思うので、憶えておかないとですね。

0 件のコメント:

コメントを投稿