2009年9月17日木曜日

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

今日のJavaの授業の終わりかけに、ちょっと困ったことが発生しました。 それは「Ifによる判断が、合っているはずなのに合わない」こと。 確かに、文字列一致の判断を行うために「==」で処理してるのになぁと、 しばらくソースを見直して、首をかしげてまた見直して・・・の繰り返し。 その時に、先生の一言でパッとみんな解けたわけですね。 「文字列一致の判断は、==ではなくてequals()。」 あぁなるほどな、と。
ということで、下にまとめます。 今回はこちらのサイトを参考にさせていただきました。 Javaにおける文字/文字列の扱い方 - ITアーキテクト [IT Architect] 上リンクにあることをさっぱり書くと、 「==」は「同オブジェクト参照チェック」で、 「equals()」は「同格納値チェック」です。 「==」は、他言語と動作(というか判断基準)が違うので、注意が必要です。
// それぞれに同じ"初期値"を与えた場合
String a1 = new String("abc");
String b1 = new String("abc");
System.out.println("それぞれに同じ\"初期値\"を与えた場合");

// == の場合
if ( a1 == b1 ) {
    System.out.println("◆==:True");   
} else {
    System.out.println("◆==:False");
}

// equals() の場合
if ( a1.equals( b1 ) ) {
    System.out.println("◆equals():True");
} else {
    System.out.println("◆equals():True");   
}

// **********************
// * 実行結果
//
// それぞれに同じ"初期値"を与えた場合
// ◆==:False
// ◆equals():True
// **********************
この場合は、a1,b1共に「同じ値」が代入されているにもかかわらず、 Javaの判断としては、「違うオブジェクトを参照」している、と取られます。 その結果、「同じオブジェクトを参照しているか」チェックする「==」はFalse、 「同じ値かどうか」チェックする「equals()」はTrueとなります。
// それぞれに同じ"オブジェクト"を与えた場合
String xy = new String("xyz");
String x1 = xy;
String y1 = xy;
System.out.println("それぞれに同じ\"オブジェクト\"を与えた場合");

// == の場合
if ( x1 == y1 ) {
    System.out.println("◆==:True");   
} else {
    System.out.println("◆==:False");
}
// equals() の場合
if ( x1.equals( y1 ) ) {
    System.out.println("◆equals():True");
} else {
    System.out.println("◆equals():True");   
}

// **********************
// * 実行結果
//
// それぞれに同じ"オブジェクト"を与えた場合
// ◆==:True
// ◆equals():True
// **********************
このソースの場合、x1,y1は同じxyを参照しています。 よって、「==」でも「equals()」でもTrueが返されます。 今後かなり多用すると思うので、憶えておかないとですね。

0 件のコメント:

コメントを投稿