【Java】文字列の値が等しいかどうかの比較を考える

Javaで文字列の値が等しいかどうかの比較をしたい場合、皆さんならどう実現しますか?

本日、後輩が「==」を使って実現していたので、この機会に改めて考えてみることにしました。

ダメなケース:「==」で比較

まだプログラミングの知識が浅い方や、別のプログラミング言語に慣れている人はこのように比較してしまうかもしれませんね。

String str = "test";

if(str == "test") {
  System.out.println("一致します");
} else {
  System.out.println("一致しません");
}

これが何故ダメなのかというと、Javaにおいては、String型のような参照型を比較演算子「==」で比較すると、オブジェクトの参照が一致しているかどうかの比較になってしまうからです。しかし、この場合は参照が一致しているかを比較したいのでなく、値が一致しているかを比較したいはず。なので、その場合は別の方法を使う必要があります。

String.equalsメソッドを使う

Javaで参照型であるStringの値の比較をする方法として一番メジャーなのが多分これです。

String str = "test";

if("test".equals(str)) {
  System.out.println("一致します");
} else {
  System.out.println("一致しません");
}

これなら文字列の値の比較がうまくできます。ちなみにこのメソッドの内部的にはchar[]型を地道に一文字ずつ比較しているそうです。

equalsメソッドに関しては、よく「定数が先か変数が先か問題」がありますよね。上の例で言うと「”test”.equals(str)」とするか「str.equals(“test”)」とするか問題です。定数を先にした場合は、「変数にnullが入っていた場合でもNullPointerException(ぬるぽ)が起こらない」というメリットがあるそうで、コーディング規約などでこちらが推奨されていることが多いです。

ただ…個人的にはこの書き方はすごくもやもやします。だって、この判定って「変数strが”test”と同じである場合」っていう意味をこめてしているわけじゃないですか?よく使われる「if(“test”.equals(str))」だと「”test”がstrと同じである場合」というニュアンスになってしまう気がします。主語が違うじゃん、っていう。

String.compareToメソッドを使う

equalsメソッドを使わない方法もあります。

String str = "test";

if("test".compareTo(str) == 0) {
  System.out.println("一致します");
} else {
  System.out.println("一致しません");
}

こんなやり方もありますね。equalsメソッドと違い、戻り値はboolean型でなくint型となります。compareToは主に文字列の大小比較に使われますが、等しいかどうかの比較にも使えるのですね。

ただ、個人的にはif文で使うなら戻り値がboolean型のequalsメソッドを使うほうがスマートだと思います。

終わりに

Javaで文字列の値が等しいかどうかの判定には、String.equalsメソッドを使用しましょう、っていうお話でした。初心者の方は「==」で判定してしまいがちですので気を付けましょう。

スポンサーリンク
レクタングル大
レクタングル大

フォローする

スポンサーリンク
レクタングル大