Java 入門

ホーム > Java の文字列 (String) > 文字列の値が等しいかチェックする時には == を利用せずに equals メソッドを使う

文字列の値が等しいかチェックする時には == を利用せずに equals メソッドを使う

ある二つ(またはそれ以上)の String オブジェクト(あるいは部分文字列)の値が等しいかどうか確認するときには、 == 演算子による比較、あるいは equals メソッドを使う二つの方法が考えられます。 しかし、文字列の値が同じであることをチェックする時は、常に equals メソッドを使うようにしましょう。

これはなぜかというと、== 演算子は文字列の格納場所が等しいことをチェックするものだからです。

具体的な例を見てみましょう。
次のコードを見てください。

public class StringTestApp1 {

  public static void main(String[] args) {

    String s1 = "Hello";
    String s2 = "Hello";

    ifs1 == s2 ){
      System.out.println("true ==");
    }
    else{
      System.out.println("false ==");
    }

  }
}

s1 と s2 という二つの String オブジェクトがあり、どちらも "Hello" という値がセットされています。 その二つを == 演算子で比較しています。
この実行結果は次のようになります。

true ==

つまり、true となりました。
これには何も問題が無いように見えます。

では、次の例を見てください。

public class StringTestApp1 {

  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]

一行目の出力から、substring メソッドで確かに "boa" という部分が取り出せていることがわかります。しかし、== 演算子でそれが "boa" と等しいかチェックすると、false となります。 一方、equals メソッドで比較している場合は意図した通り true が返されています。

これはどういうことか考える為には、前述の通り == 演算子は文字列の(メモリ上の)格納場所が等しいかどうかチェックするものだ、ということを思い出してください。

== 演算子で比較したことは、「 "Snowboard" という値の "boa" という部分は、"boa" というひとつの文字列と同じか?」 という意味になります。 通常、Java の VM はこの場合、"Snowboard" と "boa" を別の場所に確保しますから、全く別の場所を比較することになります。従って、 == 演算子による比較では false が返されたということになります。

一方、equals 演算子では文字としての値を比較しますから、上のコードは 「 "Snowboard" という文字の中の "boa" という部分は "boa" という値と等しいか? 」 という意味になり、 true が返されたというわけです。

従って、一番最初の例のように == 演算子を使って String オブジェクトを比較して true が返る場合もあるのですが、 下の例のように同様の比較をして false が返る場合もあるわけです。

このため、文字列の値が等しいか確認する目的では常に equals メソッドを使いましょう。

ホーム > Java の文字列 (String) > 文字列の値が等しいかチェックする時には == を利用せずに equals メソッドを使う