Javaの文字列はStringクラスの参照型だ。演算子で比較してもうまく動作しないことがある。
このページではJavaでの文字列比較の方法についてお伝えした。参考にしていただければと思う。
目次
Javaでの文字列の比較
整数などの基本型の場合、値が一致するかどうかの比較は「==」演算子を使用する。
しかし、Stringクラスは参照型なので「==」演算子で比較しても、オブジェクトの実体までは比較していないので正しく動作しない場合がある。
equalsメソッド
文字列の比較のために、Stringクラスではequalsというメソッドを用意している。
下記のように比較をすることができる。
比較相手の文字列.equals(比較対象の文字列);
1 |
str1.equals(str2) |
で簡単に比較することができる。
文字列と文字列の比較
実際に、「==」で比較した場合も含めて、どうなるかを見ていこう。
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class StringSample4 { public static void main(String[] args) { String str1 = "朝"; //[1] String str2 = "朝"; //[2] String str3 = new String("朝"); //[3] String str4 = "朝日"; //[4] String str5 = str1 + "日"; //[5] //「==」演算子を使用 System.out.println(str1 == str2); //[6] System.out.println(str2 == str3); //[7] System.out.println(str1 == str3); //[8] System.out.println(str4 == str5); //[9] System.out.println("---------------------------"); //.equalsメソッドを使用 System.out.println(str1.equals(str2)); //[10] System.out.println(str2.equals(str3)); //[11] System.out.println(str1.equals(str3)); //[12] System.out.println(str4.equals(str5)); //[13] } } |
実行結果
1 2 3 4 5 6 7 8 9 |
true false false false --------------------------- true true true true |
サンプルコードの説明
- [1] String型の変数str1を宣言し、初期化。
- [2] String型の変数str2を宣言し、初期化。
- [3] String型の変数str3を宣言。明示的にnew演算子を用いてStringオブジェクトを生成し値を代入。
- [4] String型の変数str4を宣言し、初期化。
- [5] String型の変数str5を宣言し、初期化。str1と文字”日”を連結した文字列を代入
- [6] str1とstr2を「==」演算子を用いて比較。
- [7] str2とstr3を「==」演算子を用いて比較。
- [8] str1とstr3を「==」演算子を用いて比較。
- [9] str4とstr5を「==」演算子を用いて比較。
- [10] str1とstr2を.equalsメソッドを用いて比較。
- [11] str2とstr3を.equalsメソッドを用いて比較。
- [12] str2とstr3を.equalsメソッドを用いて比較。
- [13] str2とstr3を.equalsメソッドを用いて比較。
「==」演算子の場合
「==」演算子を用いて比較をしても[6]のように正しい結果が返ってくることもある。
しかし、これはJavaの内部処理でなるべくメモリを有効に利用しようとしているから起こることであり、正確な動きを保証しているものではない。
str1とstr2では、宣言と同時に同じ「朝」という文字で初期化している。
この場合、「Javaの内部で同じ文字を代入していることからオブジェクトの実体を共有する」という動きになっている。そのため、「==」演算子を用いて比較しても同じだというtrueの結果が返ってくることになる。
しかし、これはJavaの内部でメモリを有効利用するために作られた仕組みであって、==演算子が値の比較を行っているわけではない。
Str3では明示的にnew演算子を用いてStringオブジェクトを生成し値を代入しているので、生成されたオブジェクトの実体の共有は行われない。そのため値は等しくないというfalseが返ってくる。
同様に、str4とstr5には、同じ「朝日」という文字列が代入されているがstr4は最初から「朝日」という文字列を代入。str5はstr1の実体に「日」という文字を連結し代入しているため、比較した結果はfalseとなる。
equalsメソッドの場合
一方、Stringクラスの.equalsメソッドを使用した場合は、実体である値を比較しているので、どのパターンでも正しく比較されtrueの結果が返っている。
文字列と文字列の比較は、分岐処理の際の条件として使われることが多い。
その際、比較演算子を正しく使用しないと正しい結果が返ってこなくなる。
また、.equalsメソッドを使用する場合に気を付けるべきことは、比較するStringクラスの文字列にnullが入っていないかをチェックすることを忘れないようにすることだ。実行した際にnullが入ってくるとプログラムは例外を発生させそこで動かなくなってしまう。
まとめ
このページではJavaでの文字列の比較について、細かいところも含めてお伝えした。いかがだっただろうか?
参照型であることから、このように少し特殊な動きをする。初心者であっても、覚えておいた方がいい知識だ。