Javaでオブジェクト比較を行う際、よく遭遇するのが NullPointerException(ヌルポ)。
特に equals() をそのまま呼び出した場合、対象が null だと即クラッシュしてしまいます。
この問題をシンプルに、かつ安全に解決するのが Objects.equals() です。
本記事では、その使い方・メリット・注意点をわかりやすくまとめます。
■ なぜオブジェクト比較でヌルポが起きるのか?
以下のようなコードは一見普通ですが…
a が null のため、a.equals(b) を実行した瞬間に例外が発生します。
Javaのequals()はインスタンスメソッドなので、
呼び出し元が null かどうかを常に気にしないといけません。
■ Objects.equals() の登場で比較が劇的に安全に
Java 1.7 以降、Objects.equals() が標準で使えるようになりました。
これは 両方がnullでもOK / 一方がnullでもOK な、安全な比較メソッドです。
▼ 例:Objects.equals() を使うと…
このコードは絶対にヌルポになりません。
▼ 動作仕様まとめ
| a | b | Objects.equals(a, b) | 備考 |
|---|---|---|---|
| null | null | true | 両方nullなら同値とみなす |
| null | abc | false | ヌルポにならない |
| abc | null | false | ヌルポにならない |
| abc | abc | true | equals() と同じ |
equals()と同じ比較を、null安全で行えるのが最大の特徴です。
■ equals() と Objects.equals() の違い
| 比較方法 | NPEリスク | 比較の正確性 | 備考 |
|---|---|---|---|
| a.equals(b) | 高い | 普通 | a が null だとNPE |
| Objects.equals(a, b) | なし | equals と同等 | Java7以降の定番 |
Objects.equals() は 内部で null チェック → equals() 呼び出し を行っています。
■ 実務でどう使う?ベストプラクティス
● ① フィールド比較(DTO, Entity, Bean)
nullを意識せずに比較できるため、非常に実用的。
● ② if文での比較処理
片側がnullの可能性がある場合でも安心。
● ③ MapやSetの比較にも利用可能
get() の戻り値が null でも安全。
■ 注意点:プリミティブ型はequalsより==でOK
プリミティブ型(int, long, booleanなど)はnullにならず、オブジェクトでもありません。
プリミティブ型はシンプルに == 比較が最適 です。
■ Objects.equals() を使うとコードが“事故りにくく”なる
-
nullチェック不要
-
読みやすい
-
equals() と同じ意味で比較できる
-
保守性が上がる
特に 業務システムや大量のBean比較があるプロジェクトで大活躍 します。
■ まとめ
Javaでのオブジェクト比較は、意外とヌルポの温床になりがちです。Objects.equals() を活用すれば、null安全でシンプルな比較が標準で実現 できます。
✔ equals() を呼び出す側がnullだとヌルポ
✔ Objects.equals() は null 安全
✔ 使いどころは DTO/if文/コレクション比較など多数
✔ Java7以降は比較の標準として利用推奨
コードの安定性を高めたいなら、ぜひ積極的に Objects.equals() を使いましょう。
