読者です 読者をやめる 読者になる 読者になる

【Java】文字列をequalsで判別する際に注意すること

Java

はじめに

Javaで文字列を比較するときには「=ではなく、equalsメソッドを使用しなきゃだめだよー。」とは言われていますが、
そのほかにも知っておくと良いことを知ったのでまとめます。

定数と変数をメソッドの前後どちらに記載するかで挙動が変わる

「{String1}.equals({String2})」で、

  1. String1に定数をいれ、String2に変数を入れる場合
  2. String1に変数をいれ、String2に定数を入れる場合

で挙動が変わってきます。
以下、それぞれのパターンで何が異なるのかをまとめます。

1. String1に定数をいれ、String2に変数を入れる場合

{String1}の定数に対し、{String2}の変数が同じ文字列であるか否かを判別します。
そのため、{String2}の変数がnullであってもなくても正常に動作します。

2. String1に変数をいれ、String2に定数を入れる場合

一方、{String1}の変数に対し、{Sting2}の定数の文字列が同じであるか否かを判別する場合、
{String1}の変数がnullの時、nullに対して判別処理を実行しようとする
NullPointerExceptionが発生します。

そのため、{String1}の変数のnullチェック処理を行わないと意図せぬ例外が発生していまします。

おわりに

どちらがいいということではなく、

  • 単に文字列を検証するのであれば、後者の方が例外になってくれるので使い易い
  • 上記以外の場合、比較する変数のnullチェックの処理が必要になるため、無駄に処理が増える

かなと、個人的には思っています。
ただ、知らないうちに意図せぬ例外が発生するようなコードを書いてしまうことは避けたいですねー。

サンプルソース

/**
 * 検証用クラス。
 */
public class StringEqualsTest {
    /**
     * メイン。
     * @param args 引数
     */
    public static void main(String[] args) {
        String value = "TEST";
        // String value = null;

        // 定数.equals(変数)の場合
        if ("TEST".equals(value)) {
            System.out.println("同じだよー。");
        }
        // 変数.equals(定数)の場合
        if (value != null) {
            if (value.equals("TEST")) {
                System.out.println("同じだよー。");
            }
        }
    }
}