Javaで文字列と文字列の比較
「==」演算子
変数に格納されている値がある整数と等しいかどうかは「==」演算子を使って次のように確認できる。
1 2 3 4 5 | int num = 10; if (num == 10){ /* 等しい場合の処理 */ } |
これに対して文字列が他の文字列と等しいかどうか調べる場合には注意が必要となる。
次の例を試すと…
1 2 3 4 5 6 7 8 | String str1 = "abc"; String str2 = "abc"; if (str1 == str2){ System.out.println("等しい"); }else{ System.out.println("等しくない"); } |
結果は「等しい」と出る。
次にもう一つ例を試すと…
1 2 3 4 5 6 7 8 9 10 | String str1 = "abc"; String str2 = "ab"; str2 = str2 + "c"; if (str1 == str2){ System.out.println("等しい"); }else{ System.out.println("等しくない"); } |
今度は「等しくない」と表示される。
Stringクラスの変数は参照型なので、Stringクラスのインスタンスを参照している参照値が入っている。
どちらも同じ文字列である”abc”を表すStringクラスのインスタンスだが、1回目の場合は内部的に
1 2 | String str1 = new String("abc"); String str2 = str1; |
のような動きをしている為、「等しい」とでる。
(Java内部では、同じ文字列の変数を宣言すると、リソースを節約するために参照渡し参照値の値渡しを行う)
しかし、2回目の場合は同じ文字列であっても「str2 = str2 + “c”;」を実行した時に新たにインスタンスを作成(new String())し、文字列”abc”を格納した後でそのインスタンスの参照値を変数に代入している。
従って、変数「str1」と変数「str2」に代入されたインスタンスの参照値は異なる。
この為、同じ文字列が格納されているかどうかを調べる時には「==」演算子は利用できない。
equalsメソッド
オブジェクトが同一なのかを調べるのではなく、オブジェクトに格納されている文字列が等しいかどうかを調べるにはStringクラスで用意されているequalsメソッドを使用する。
1 | 文字列オブジェクト1.equals(文字列オブジェクト1) |
この場合、文字列オブジェクト1が表す文字列と文字列オブジェクト2が表す文字列が同じであった場合にtrueとなる。
これを先ほどの例に当てはめると…
1 2 3 4 5 6 7 8 9 10 | String str1 = "abc"; String str2 = "ab"; str2 = str2 + "c"; if (str1.equals(str2)){ System.out.println("等しい"); }else{ System.out.println("等しくない"); } |
今度は変数「str1」と変数「str2」に代入されているインスタンスの参照値は異なるが、インスタンスに入っている文字列は同じなので「等しい」と表示される。
今回はどちらも変数に代入したものを比較しているが、次のようにどちらかを文字列の値で記述しても構わない。
1 2 3 4 5 6 7 8 9 | String str = "abc"; if (str.equals("abc")){ System.out.println("等しい"); } if ("abc".equals(str)){ System.out.println("等しい"); } |
サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | class testCompare{ public static void main(String args[]){ String str1 = "abc"; String str2 = "abc"; String str3 = "ab"; System.out.println("str1 = " + str1); System.out.println("str2 = " + str2); if (str1 == str2){ System.out.println("等しい"); }else{ System.out.println("等しくない"); } str3 = str3 + "c"; System.out.println("str1 = " + str1); System.out.println("str3 = " + str3); if (str1 == str3){ System.out.println("等しい"); }else{ System.out.println("等しくない"); } System.out.println("equalsメソッドで比較"); if (str1.equals(str3)){ System.out.println("等しい"); }else{ System.out.println("等しくない"); } } } |