文字列の値が等しいかチェックする時には == を利用せずに equals メソッドを使う
ある二つ(またはそれ以上)の String オブジェクト(あるいは部分文字列)の値が等しいかどうか確認するときには、 == 演算子による比較、あるいは equals メソッドを使う二つの方法が考えられます。
しかし、文字列の値が同じであることをチェックする時はいつも equals メソッドを使うようにしましょう。
この記事ではその理由を説明します。
== 演算子は文字列の格納場所が等しいことをチェックします。
具体的な例を見てみましょう。
次のコードを見てください。
public class TestApp {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "Hello";
if (s1 == s2) {
System.out.println("true [==]");
} else {
System.out.println("false [==]");
}
}
}
s1 と s2 という二つの String オブジェクトがあり、どちらも "Hello" という値がセットされています。 その二つを == 演算子で比較しています。
この実行結果は次のようになりました。
true [==]
これには何も問題が無いように見えます。
では、次の例を見てください。
public class TestApp {
public static void main(String[] args) {
String s = "Snowboard";
// substring メソッドで取り出した部分の値を一応確認
System.out.println(s.substring(4, 7));
// == 演算子による比較
if (s.substring(4, 7) == "boa") {
System.out.println("true! [==]");
} else {
System.out.println("false! [==]");
}
// equals メソッドによる比較
if (s.substring(4, 7).equals("boa")) {
System.out.println("true! [equals]");
} else {
System.out.println("false! [equals]");
}
}
}
もとの s という String オブジェクトに "Snowboard" という値をセットして、そこから substring メソッドを使って、"Snowboard" の "boa" の部分だけ取り出しています。
その取り出した部分が確かに "boa" という値であるかチェックするために、== 演算子と equals メソッドを用いています。
この実行結果は次のようになります。
boa
false! [==]
true! [equals]
1行目の出力から、substring メソッドで確かに "boa" という部分が取り出せていることがわかります。しかし、== 演算子でそれが "boa" と等しいかチェックすると、false となります。 一方、equals メソッドで比較している場合は意図した通り true が返されています。
これはどういうことでしょうか?
前述の通り == 演算子は文字列の(メモリ上の)格納場所が等しいかどうかチェックするものです。
== 演算子で比較したことは、「 "Snowboard" という値の "boa" という部分は、"boa" というひとつの文字列と同じか?」 という意味になります。 通常、Java の VM はこの場合、"Snowboard" と "boa" を別の場所に確保しますから、全く別の場所を比較することになります。従って、 == 演算子による比較では false が返されたということになります。
一方、equals 演算子では文字としての値を比較しますから、上のコードは 「 "Snowboard" という文字の中の "boa" という部分は "boa" という値と等しいか? 」 という意味になり、 true が返されたというわけです。
一番最初の例のように == 演算子を使って String オブジェクトを比較して true が (たまたま) 返る場合もあります。 しかし、下の例のように同様の比較をして false が返る場合もあります。
このように、文字列に対する == 演算子による比較は、値が正しいことを確認するために使えるものではありません。 文字列の値が等しいか確認する目的では常に equals メソッドを使いましょう。