他言語を利用してきた開発者が Java を初めて学ぶ時、戸惑うことの1つに文字列の一致判定があります。初めて学習するプログラミング言語が Java であるのであれば特に気になることもないのかもしれません。
スポンサーリンク
文字列の一致判定 ( String.equals )
次のサンプルは文字列の一致判定を == 演算子と String.equals でそれぞれ行い、挙動の違いを確認しています。
String str1 = "123"; String str2 = "123"; String str3 = str1 + str2; String str4 = str1 + str2; if(str1 == str2) { System.out.println("str1 == str2"); // こっちを通る } else { System.out.println("str1 != str2"); } if(str3 == str4) { System.out.println("str3 == str4"); } else { System.out.println("str3 != str4"); // こっちを通る(期待しない動作) } if(str3.equals(str4)) { System.out.println("str3 equlas str4"); // こっちを通る(期待する動作) } else { System.out.println("str3 not equla str4"); }
サンプルの出力結果
str1 == str2 str3 != str4 str3 equlas str4
ポイント
Java では文字列の一致判定には、String.equals メソッドを使用する必要があります。 == 演算子で比較すると文字列の中身ではなく String オブジェクトが一致しているかを判定することになってしまいます。
上記サンプルの実行結果の中で str1 と str2 はオブジェクトレベルで一致していることになっていること判定されています。(これはこれで個人的には、あるべき姿なのかは疑問があったりもします)
初期化の時点では同じオブジェクトとして判定されますが、str3 と str4 がそれぞれ別のオブジェクトとして作成されます。str3 と str4 は別オブジェクトであり、別領域にそれぞれ文字列を持っていますので、== でオブジェクトの比較を行っても一致しないことになります。
あくまでもデータの文字列が一致しているかの判定は、String.equals メソッドを使用する必要があります。
Java は融通が利かない頑固な言語に感じてしまいます。私が Java を使用すると文字列の一致判定で、バグがたくさん混入してしまいます。