文字列の値が等しいかチェックする時には == を利用せずに 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 メソッドを使いましょう。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門