文字列の比較


ユーザが入力した文字列がある文字列と一致しているかどうかをチェックするのに, 以下のように演算子「==」を使うのが自然に思える.
import java.io.*; // 入力に関するクラスを使う時は必要
class CheckTanaka{
   // throws IOException で内部で入出力エラーが起きる可能性があることを示す
  public static void main(Str args) throws IOException{
  // 入力をするためには,System.inからBufferedReaderを作らなくてはいけない
    BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
    // 文字列型(String)の変数 family を定義
    String family;
    System.out.println("名字を入力してください> ");
    family=d.readLine();
    if(family == "tanaka"){
      System.out.println("あなたの名前はおそらく田中です(田仲かもしれません).");
    }
  }
}
しかし,上のプログラムを実行してみると正しく tanaka と入力しても何も表 示されない.実は,演算子「==」は文字列に対しては予想したようには働かな いことがあるで注意が必要である.

演算子「==」の動作を見るために,以下のプログラムを見てみる.

class StringTest {
    public static void main(String[] args){
	String a=new String("tanaka");
	String b=a;
	String c=new String("tanaka");
	System.out.println("a==b -> "+(a==b));
	System.out.println("a==c -> "+(a==c));
	System.out.println("b==c -> "+(b==c));
    }
}
このプログラムを実行してみると,
ux103$ java StringTest
a==b -> true
a==c -> false
b==c -> false
のような結果になる.これは,String型の変数 a, b と cが下の図のように 別々の文字列オブジェクトを指していることによる.

文字列型(あとで出てくるオブジェクト型,配列型も同様)の変数に対する 「==」は中身が同じでも別々に生成された(別々のnew Stringに対応する) 文字列オブジェクトに対しては,false(偽)を返すという仕様になっている.

文字列の同一性を比較するには, Stringクラ ス のメソッド equalsを使って,

文字列1.equals(文字列2)
のようにする.「文字列」と書いたところは,文字列定数(「"」と「"」で囲まれるも の)の他に,文字列型の変数,文字列型の式などが許される.さきほどの式は,
import java.io.*; // 入力に関するクラスを使う時は必要
class CheckTanaka{
   // throws IOException で内部で入出力エラーが起きる可能性があることを示す
  public static void main(String[] args) throws IOException{
  // 入力をするためには,System.inからBufferedReaderを作らなくてはいけない
    BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
    // 文字列型(String)の変数 family を定義
    String family;
    System.out.println("名字を入力してください> ");
    family=d.readLine();
    if(family.equals("tanaka")){
      System.out.println("あなたの名前はおそらく田中です(田仲かもしれません).");
    }
  }
}
と変更すると,
ca20121$ java CheckTanaka
名字を入力してください> 
tanaka
あなたの名前はおそらく田中です(田仲かもしれません).
のように正しい結果を出す.
C++に詳しい人の場合は,Javaにおけるオブジェクト同士の「==」による比較は, C++のポインタの比較と同じようなものだと思って欲しい.

次に進む