文字列と文字列の比較

広告

変数に格納されている値がある整数に等しいかどうかは「==」演算子を使って次のようにすることで確認できました。

int num = 5;

if (num == 5){
  /* 等しい時の処理 */
}

これに対して文字列が他の文字列と等しいかどうか調べる場合には注意が必要です。これはStringクラスの変数が参照型のためです。

次の例を試して下さい。

String str1 = "abc";
String str2 = "abc";

if (str1 == str2){
  System.out.println("等しい");
}else{
  System.out.println("等しくない");
}

これを実際に試すと結果は「等しい」と出ます。これはたまたまです。"abc"という文字列をどこかの入れ物に入れてその位置を最初に変数「str1」に代入し、次に同じように"abc"という文字列を先ほどとは別の入れ物に入れてその位置を変数「str2」に代入するため、この二つの単に比較しても本来等しくならないはずですが、Javaではこのような時に1番目と2番目で同じ"abc"の位置を代入しているようです。(文字列は一度作成すると変更不可なのでこのようにしても問題はおきません)。

ではもう一つ例を試して下さい。

String str1 = "abc";
String str2 = "ab";

str2 = str2 + "c";

if (str1 == str2){
  System.out.println("等しい");
}else{
  System.out.println("等しくない");
}

今度は「等しくない」と表示されます。どちらも同じ文字列である"abc"を表すStringクラスのオブジェクトですが、今度の場合は同じ文字列であっても「str2 = str2 + "c";」を実行した時に入れ物を別に作り文字列"abc"を格納した後でその入れ物の位置を変数に代入しています。よって変数「str1」と変数「str2」に代入された入れ物の位置は異なります。

文字列と文字列を比較する場合、「==」演算子を使うと同じ文字列でも等しいと判定されたり等しくないと判定されたりします。どういった時にどう判定されるのかはJavaの実装にも依存してしまいますのでオブジェクトの比較ではなく同じ文字列が格納さえているかどうか調べる時には「==」演算子は使わないで下さい。

equalsメソッド

オブジェクトが同一なのかを調べるのではなく、オブジェクトに格納されている文字列が単に同じかどうか調べるにはStringクラスで用意されているequalsメソッドを使います。実際には次のように記述します。

文字列オブジェクト1.equals(文字列オブジェクト1)

この場合、文字列オブジェクト1が表す文字列と文字列オブジェクト2が表す文字列が同じであった場合にtrueとなります。よって文字列が他の文字列と同じ文字の並びとなっているかどうか調べるには次のように記述します。

String str1 = "abc";
String str2 = "ab";

str2 = str2 + "c";

if (str1.equals(str2)){
  System.out.println("等しい");
}else{
  System.out.println("等しくない");
}

今度は変数「str1」と変数「str2」に代入されている入れ物の位置は異なりますが、入れ物に入っている文字列は同じですので「等しい」と表示されます。

今回はどちらも変数に代入したものを比較していますが、次のようにどちらかを文字列の値で記述しても結構です。

String str = "abc";

if (str.equals("abc")){
  System.out.println("等しい");
}

if ("abc".equals(str)){
  System.out.println("等しい");
}

サンプル

では簡単な例で試しておきます。

JSample4_1.java

class JSample4_1{
  public static void main(String args[]){
    String str1 = "abc";
    String str2 = "abc";
    String str3 = "ab";

    System.out.println("str1 = " + str1);
    System.out.println("str2 = " + str2);

    if (str1 == str2){
      System.out.println("等しい");
    }else{
      System.out.println("等しくない");
    }

    str3 = str3 + "c";

    System.out.println("str1 = " + str1);
    System.out.println("str3 = " + str3);

    if (str1 == str3){
      System.out.println("等しい");
    }else{
      System.out.println("等しくない");
    }

    System.out.println("equalsメソッドで比較");
    if (str1.equals(str3)){
      System.out.println("等しい");
    }else{
      System.out.println("等しくない");
    }
  }
}

コンパイル後に実行すると次のように表示されます。

p4-1

( Written by Tatsuo Ikura )