Javaにおける文字列と文字列の比較について。比較演算子「==」とequals()メソッドの注意点です。
確認用サンプル
文字列の比較は比較演算子「==」か、equals()メソッドで可能です。
public class StringCompare { public static void main(String[] args) { // 変数とリテラル String strA = "テスト"; if (strA == "テスト") { System.out.println("strA == \"テスト\" :同じ"); } else { System.out.println("strA == \"テスト\" :違う"); } if (strA.equals("テスト")) { System.out.println("strA.equals(\"テスト\") :同じ"); } else { System.out.println("strA.equals(\"テスト\") :違う"); } // 変数と変数(リテラル同士) String strA2 = "テスト"; String strB2 = "テスト"; if (strA2 == strB2) { System.out.println("strA2 == strB2 :同じ"); } else { System.out.println("strA2 == strB2 :違う"); } if (strA2.equals(strA2)) { System.out.println("strA2.equals(strA2) :同じ"); } else { System.out.println("strA2.equals(strA2) :違う"); } // 変数と変数(リテラルとオブジェクト) String strA3 = "テスト"; String strNew = new String("テスト"); if (strA3 == strNew) { System.out.println("strA3 == strNew :同じ"); } else { System.out.println("strA3 == strNew :違う"); } if (strA3.equals(strNew)) { System.out.println("strA3.equals(strNew) :同じ"); } else { System.out.println("strA3.equals(strNew) :違う"); } } }
結果はこんな感じです。
リテラルとオブジェクト(newしたStringの変数)を比較演算子「==」で判定すると、falseが返って来ます。
なので、比較演算子「==」とequals()メソッド、どっちがいいのと言われたら、個人的にはequals()メソッドをオススメします。
絶対にそうしろとは言わないのですが、equals()メソッドにも注意点があります。
equals()メソッドが全てを解決する…?
ただし、equals()メソッドが万能かと言われるとそうではなくて、例えば、
String strA4 = null; String strB4 = "テスト"; if(strA4.equals(strB4)) { System.out.println("strA.equals(strB4)) :同じ"); } else { System.out.println("strA.equals(strB4)) :違う"); }
の様に、nullの変数に対してequals()メソッドを呼び出した場合、NullPointerExceptionが発生してしまいます。残念ながらそういう仕様です。
なので、equals()メソッドを使いたい場合はnullチェックを事前に実施するか、nullを許容しない作りにするかを決めておく必要があります。
.