last-modified: Dec./23rd/2001
前節では条件の真偽によって制御の流れが変わる if 文を紹介しました。本節では、文字列を equals() メソッドを使って比較した条件を使ってみます。
== と equals()== と equals() の違いについては 文字列の節 で詳しく説明しました。本節でも簡単に説明しておきます。
文字列は String クラスをインスタンス化したオブジェクトですが、 String クラスには、文字列として等価であるかどうか比較する為のメソッドが用意されています。
equals() | 文字列の内容が等価であるか |
|---|---|
equalsIgnoreCase() | 大文字/小文字の区別を無視 |
endsWith() | その文字で終了するかどうか |
startsWith() | その文字で開始するかどうか |
ソースコードの実例の断片:
String x,y,z;
x = new String("Hello");
y = new String("Hello");
z = new Streing("HELLO");
System.out.println(x == y); //false
System.out.println(x.equals(y)); //true
System.out.println(x.equals(z)); //false
System.out.println(x.equalsIgnoreCase(z)); //true
== は変数に格納された値が同じものであるかどうかを比較します。基本データ型(プリミティブ型)の場合は変数には値が保持されているので、「変数に代入された値が同じかどうか」が真偽に対応します。文字列の場合は、変数に代入されているのは、メモリ上の別の場所に存在する文字列を識別する ID です。別個に存在する文字列を識別する ID は違うものになりますから、別個に定義した文字列を参照する変数には、異なる ID が代入されています。従って、 == で比較すると偽になります。これは文字列に限らず、オブジェクト一般にいえることです。
equals() メソッドで比較するのは、変数に代入された ID ではなく、その ID によって識別されるオブジェクト同士が比較されます。その為、別の実体として存在する場合でも、オブジェクトとして等価であれば真が返ります。文字列の場合は、String 型オブジェクトが保持している文字の配列が一文字ずつ比較されます。
文字列の場合にややこしいのが、次の二つの記法です。
String str1 = "Hello"; // 記法1
String str2 = new String("Hello"); // 記法2
記法1 の場合は何度記述しても、同じオブジェクトに対する参照が変数にコピーされますが、記法2 の場合は、記述する度に別のオブジェクトが生成されて、各々の参照が変数にコピーされます。よって、記法1 の場合は、== で true が返りますが、記法2 の場合は false が返ります。他にも、 == で false が返る場合を考えることができます。いずれの場合も、equals() では true が返るので、文字列の内容を比較する場合は equals() メソッドを使うのだと覚えてください。
コマンドライン引数からユーザ名を受け取り、比較します。
IDCheck.java:
class IDCheck {
public static void main(String[] args) {
if (args[0].equals("sugai")) {
System.out.println("ユーザを確認しました。");
} else {
System.out.println("そんなユーザはいません。");
}
}
}
if() の条件式は、文字列の等価性比較メソッド equals() が使われています。 String クラスをインスタンス化したオブジェクト args[0] は、メソッド equals() を受け継いでいます。 args[0].equals() は、オブジェクト args[0] のメソッドであり、このオブジェクトと、引数で持っている文字列が等価であるかどうかを判定し、 true/false を返します。
まだオブジェクトとインスタンス化について説明していないので、分からなくても尤もです。文字列A.equals("文字列B") で、文字列比較が出来るということだけ覚えてください。
C:\Java>javac IDCheck.java C:\Java>java IDCheck SUGAI そんなユーザはいません。 C:\Java>java IDCheck sugai ユーザを確認しました。
メソッド equals() は大文字/小文字の区別 (Case Dependent) をしますので、"SUGAI" では true になりません。大文字/小文字を区別したくなければ、 equalsIgnoreCase() を利用します。
args[0].equalsIgnoreCase("sugai")
文字列を操作するメソッドは他にも沢山ありますが、String クラスのメソッドで紹介します(多分)。
次に、もう一つの条件分岐である、 switch 文について紹介します。