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が下の図のように 別々の文字列オブジェクトを指していることによる.
文字列の同一性を比較するには, 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++のポインタの比較と同じようなものだと思って欲しい.