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++のポインタの比較と同じようなものだと思って欲しい.