1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Javaのequalsメソッドについて

Last updated at Posted at 2022-09-15

今日の実務で、実装レビューにて指摘があった箇所を備忘録として残す。

Javaの経験が浅い方や、古いバージョン(8以前)を中心に実装していた方もためになるかと思います。

Stringクラスのequalsメソッド

Java歴が浅い方や最近学習を始めたという方は、文字列比較のために、Stringクラスのequalsメソッドを基本として学ぶと思います。
(僕も研修や独学時代はこれしか学びませんでしたし、今も癖で使ってしまいます。)


Stringクラスのequalsメソッドは、比較する文字列が同値であるかどうかを判定してくれます。
なので、参照先が異なっていたとしてもtrueを返却してくれます。

String a = "あいう";
String b = "あいう";
String c = new String("あいう");

System.out.print(a.equals(b));//true
System.out.print(a.equals(c));//true

(余談:実はObjectクラスのequalsメソッドをStringクラスがオーバーライドしてくれていたことは知らずに使っていました。
Objectクラスのequalsメソッドは同一性を判定してれます。)

nullの可能性がある場合は必ずnull判定が必要になる

実務内では、かなりnullの考慮が必要だと感じています。
利用する変数にnullが入ってくる可能性があるのであれば、nullチェックもしくはnullを許容してくれる実装をしなければいけません。

例えば、以下ではNullPointerExceptionが発生します。

String a = null;
String b = "あいう";

System.out.print(a.equals(b));//ヌルポで落ちます

障害が起きてしまうので、こういったnullが入る可能性のある変数には、nullチェックが必要です。

String a = null;
String b = "あいう";
if (a!=null) {
  System.out.print(a.equals(b));//実行されない
}

Objectsクラスのequalsメソッドを使う

nullチェックを毎度やるのは大変

毎度if文でnullチェックを行うのは、if文をネストしてしまう原因にもなり、可読性が落ちます。

なので、今僕はOptional型を使ったりしてうまく回避していくのですが、今回はObjectsクラスのequalsメソッドを利用しました。

String a = null;
String b = "あいう";
String c = null;

System.out.print(a.equals(b)); // false
System.out.print(a.equals(c)); // true

Objectsクラスのequalsメソッドはnull同士でも比較できる優れもので、NullPointerExceptionが発生する可能性はありません。

変数にnullの可能性がある場合については、こちらを利用する癖をつけていきたいです。

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?