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を許容しない作りにするかを決めておく必要があります。
.