6
3

ヌルポも怖くない、Javaでの比較について

Posted at

Javaで比較する術は?

業務で比較について勉強することがあったので、記事にまとめておくよ。
javaで比較するときによく使うものとして、
equals()==Objects.equalsがあるのでそれぞれ簡単に解説するよ。

equalsメソッド(String.equals())

equalsメソッドは、Stringクラスの文字列を比較するときに利用されるものだよ。
ただし、nullと比較する場合にヌルポ(NullPointerException)が発生することもあるので、注意が必要だよ。基本的な使い方は以下の通り。

str1.equals(str2);

具体的には、

public class Main {
    public static void main(String[] args) {
        String str1 = "Qiita";
        String str2 = "Qiita";
        String str3 = "qiita";

        System.out.println(str1.equals(str2));
        System.out.println(str1.equals(str3));
    }
}
// 実行結果
true
false

ただし、nullとの比較の場合はこんな感じ。

public class Main {
    public static void main(String[] args) {
        String str1 = "Qiita";
        String str2 = null;

        System.out.println(str1.equals(str2)); //false
        System.out.println(str2.equals(str1)); //ヌルポ発生
        System.out.println(str2.equals(str2)); //ヌルポ発生
    }
}

まとめると以下のようになるよ。

  • nullでない値.equals(nullでない値)→比較可能
  • nullでない値.equals(null)→false
  • null.equals(nullでない値)→ヌルポ
  • null.equals(null)→ヌルポ

== 演算子

==は変数の値が等しいかを検証する演算子だよ。プリミティブ型は値が等しいか(同値性)を検証し、オブジェクト型では同じインスタンスであるか(同一性)を検証するよ。詳しくは書くとややこしくなるので、今回は簡単にだけ解説するよ。
まずはプリミティブ型の比較だよ。

public class Main {
    public static void main(String[] args) {
        int num1 = 1;
        int num2 = 1;
        int num3 = 2;

        System.out.println(num1 == num2);
        System.out.println(num1 == num3);
    }
}
// 実行結果
true
false

次にオブジェクト型の比較だよ。ここはコンスタントプールといったJavaの仕組み等が関係しているので、気になる方は調べてみてね。

public class Main {
    public static void main(String[] args) {
        String str1 = "Qiita";
        String str2 = "Qiita";
        String str3 = new String("Qiita");

        System.out.println(str1 == str2);
        System.out.println(str1 == str3);
    }
}
// 実行結果
true
false

Objects.equals()メソッド

Objects.equals()String.equals()とは使い方が違うよ。
String.equals()はヌルポが発生する可能性があるのに対して、Objects.equals()の場合はヌルポが発生しないよ。

Objects.equals(str1, str2);

具体的な使い方はこんな感じ。

import java.util.Objects;

public class Main {
    public static void main(String[] args) {
        String str1 = null;
        String str2 = "Qiita";
        String str3 = null;

        System.out.println(Objects.equals(str1, str2));
        System.out.println(Objects.equals(str1, str3));
    }
}
// 実行結果
false
true

まとめ

Javaで比較するには、Objects.equals()を使うとかなり便利。ただし、プリミティブ型の比較の場合は==演算子を用いた方が可読性や処理速度が上がるため使い分けが必要だよ。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3