Javaでは比較演算子を用いて左右の被演算子が同じであるかどうかを確認できます。例えば、「3 == 5」のような数値を比較したり、「’あ’ == ‘ア’」のような文字も比較できます。
しかし、文字列は比較演算子で同じ文字列であるかどうかを比較してはいけません。
Javaでの文字列の扱い
基本データ型は同じ型であれば比較が可能です。char型同士の文字比較やint型同士の数値比較などです。10.5 == 10などのdouble型とint型の比較もintがdoubleに型変換され比較が行われます。
しかし、文字列であるString型は基本データ型ではない為、比較演算子での比較は文字列の比較ではなく、「同じインスタンスであるかどうか」の比較になります。
※インスタンスについては後述
「”Java” == “Java”」や「”java” == “jaba”」などの比較はエラーはおこりません。「”Java” == “Java”」はtrue、「”java” == “jaba”」はfalseになる為、文字列を比較しているように見えます。しかし、これは同じインスタンスかどうかしか比較していませんので厳密な文字列比較にはなっていません。
例えば、以下のような記述でString型の比較を行うとfalseとなります。
String str = “Java”;
String str2 = new String(“Java”);
System.out.println(str == str2);
※String str2 = new String(“Java”); の記述の詳細は後述
文字列の比較
Javaでは文字列比較を行う際は以下のように記述します。
文字列比較の文法 | String型の変数名.equals(文字列) |
---|---|
記述例 | String title = “JavaRU” title.equals(“Javaru”) |
()内の文字列はString型の変数でも可能です。
文字列の比較は以下の形でも可能です。以下は文字列Aと文字列Bを比較しています。
“文字列A”.equals(“文字列B”)
文字列比較 サンプルプログラム
以下のプログラムを「Number11.java」という名前でworkフォルダ内に保存します。
保存が完了したら、コマンドプロンプトを起動し、コンパイルおよび実行を行ってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Number11{ public static void main(String[] args){ //String型の変数作成 String a = "JavaRU"; String b = "JavaRU"; String c = new String("JavaRU"); //インスタンスの比較(文字列の比較ではない) System.out.println(a == b); //true System.out.println(b == c); //false //文字列比較 System.out.println(a.equals(b)); //true System.out.println(a.equals(c)); //true //論理演算子を用いた記述 System.out.println(a.equals(c) && a.equals("javaru")); //false } } |
実行例
c:\work>javac Number11.java
c:\work>java Number11
true
false
true
true
false
※実行例はコンパイルから実行までの例を表示しています。
文字列比較 復習問題
- 以下の選択肢からString型の変数strの文字列と”java”を比較しているものを選んで下さい。
- 解答群
- str == java
- ‘str’ == ‘java’
- “str” == “java”
- str.equals(“java”)
- 文字列を比較する際に正しい記述を選んで下さい。
- 解答群
- java == java
- ‘java’ == ‘java’
- “java”.equals(“java”)
- “java” == “java”
- 以下の記述はどのような結果になるか選んで下さい。
String name = "田中";
System.out.println(name == "鈴木"); - 解答群
- コンパイルエラー
- false
- 実行時エラー
- true
- お疲れ様でした。
まとめ
- String型の比較は「==」で比較してはならない
- 「==」で比較してもエラーにはならない
- String.equals(String)の形で比較しなければならない