カテゴリ: JavaSilver試験対策 更新日: 2026/03/24

Javaのequalsメソッドの正しいオーバーライド方法を徹底解説!

029
Javaのequalsメソッドの正しいオーバーライド

先生と生徒の会話形式で理解しよう

生徒

「Javaのequalsメソッドを使った比較がうまくいかないのですが、どうすればよいですか?」

先生

「それはequalsメソッドのオーバーライドが正しくないからかもしれませんね。基本から応用まで詳しく解説していきます!」

1. Objectクラスのequalsメソッドの仕組み

1. Objectクラスのequalsメソッドの仕組み
1. Objectクラスのequalsメソッドの仕組み

JavaのObjectクラスに定義されているequalsメソッドは、以下のように実装されています:


public boolean equals(Object obj) {
    return (this == obj);
}

このデフォルト実装では、同一性(参照が同じかどうか)を確認します。つまり、2つの変数が同じオブジェクトを指している場合にのみtrueを返します。

2. サンプルコードで学ぶequalsメソッドの問題点

2. サンプルコードで学ぶequalsメソッドの問題点
2. サンプルコードで学ぶequalsメソッドの問題点

以下のコードでは、equalsメソッドが正しくオーバーライドされていないため、期待通りの動作をしません。


public class Sample {
    private int num;

    public Sample(int num) {
        this.num = num;
    }

    public boolean equals(Sample obj) {
        if (obj == null) {
            return false;
        }
        return this.num == obj.num;
    }
}

このクラスを使うと、次のようなコードで期待通りの結果が得られません:


public class Main {
    public static void main(String[] args) {
        Object a = new Sample(10);
        Object b = new Sample(10);
        System.out.println(a.equals(b)); // false
    }
}

この結果がfalseになる理由は、equalsメソッドが正しくオーバーライドされていないためです。

3. 正しいequalsメソッドのオーバーライド

3. 正しいequalsメソッドのオーバーライド
3. 正しいequalsメソッドのオーバーライド

equalsメソッドを正しくオーバーライドするには、以下の点を守る必要があります:

  • Object型を引数として受け取る。
  • 型の確認を行う。
  • 比較対象のフィールドを指定して比較する。

修正版のコード


public class Sample {
    private int num;

    public Sample(int num) {
        this.num = num;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Sample sample = (Sample) obj;
        return num == sample.num;
    }
}

このコードでは、equalsメソッドが正しくオーバーライドされているため、期待通りの結果が得られます。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

4. 修正版コードの動作確認

4. 修正版コードの動作確認
4. 修正版コードの動作確認

修正版のクラスを使用した場合の結果を確認してみましょう:


public class Main {
    public static void main(String[] args) {
        Object a = new Sample(10);
        Object b = new Sample(10);
        System.out.println(a.equals(b)); // true
    }
}

このコードでは、equalsメソッドが正しくオーバーライドされているため、trueが出力されます。

5. equalsメソッドをオーバーライドする際の注意点

5. equalsメソッドをオーバーライドする際の注意点
5. equalsメソッドをオーバーライドする際の注意点
  • hashCodeメソッドもオーバーライドする:equalsメソッドをオーバーライドした場合は、hashCodeメソッドもオーバーライドする必要があります。
  • フィールドの比較を明確にする:どのフィールドを比較するかを明確に定義する。
  • nullチェックを忘れない:比較対象がnullの場合にfalseを返す。

6. 実践課題

6. 実践課題
6. 実践課題

以下のコードを試して、equalsメソッドのオーバーライドの重要性を確認してみましょう:


public class Practice {
    public static void main(String[] args) {
        Sample obj1 = new Sample(20);
        Sample obj2 = new Sample(20);
        System.out.println(obj1.equals(obj2)); // true
    }
}

このコードでは、equalsメソッドが正しく実装されているため、trueが出力されます。

7. equalsとあわせてhashCodeをオーバーライドする理由

7. equalsとあわせてhashCodeをオーバーライドする理由
7. equalsとあわせてhashCodeをオーバーライドする理由

Javaの規約では、「equalstrueを返す2つのオブジェクトは、同じhashCodeを返さなければならない」と定められています。これを守らないと、HashSetHashMapなどのコレクションで正常に動作しません。

以下のコードは、SampleクラスにhashCodeを追加した例です:


@Override
public int hashCode() {
    return java.util.Objects.hash(num);
}

もしhashCodeをオーバーライドしない場合、equalsで等しいと判定されるオブジェクト同士でも、ハッシュ値が異なると「別のバケツ」に分類されてしまい、データが見つからないというバグが発生します。

8. instanceof演算子を使った簡潔な実装

8. instanceof演算子を使った簡潔な実装
8. instanceof演算子を使った簡潔な実装

Javaの最近の開発スタイルでは、getClass()の代わりにinstanceof演算子を使うことも多いです。これを使うと、nullチェックと型チェックを一度に行うことができ、コードがよりシンプルになります。

instanceofを使用した、モダンで洗練された実装例を見てみましょう:


@Override
public boolean equals(Object obj) {
    if (this == obj) return true;
    if (!(obj instanceof Sample)) return false; // 型チェックとnullチェックを同時に実施
    Sample other = (Sample) obj;
    return num == other.num;
}

実行結果:


true

この書き方でも、基本的には同じ動作を保証できます。ただし、継承関係があるクラスで比較を行う場合は、getClass()instanceofで挙動が変わるため、プロジェクトの設計方針に合わせて選択することが大切です。

まとめ

まとめ
まとめ

今回は、Javaにおけるequalsメソッドの正しいオーバーライド方法について学びました。デフォルトのequalsメソッドでは参照の同一性しか比較できないため、カスタムクラスで値を比較したい場合は必ずequalsメソッドをオーバーライドする必要があります。特に、hashCodeメソッドとの整合性を保つことが重要です。また、オーバーライドする際にはnullチェックや型の確認を忘れないようにしましょう。

サンプルプログラム


public class AdvancedSample {
    private int num;

    public AdvancedSample(int num) {
        this.num = num;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        AdvancedSample sample = (AdvancedSample) obj;
        return num == sample.num;
    }

    @Override
    public int hashCode() {
        return Integer.hashCode(num);
    }
}

このコードは、equalsメソッドとhashCodeメソッドの両方を正しくオーバーライドしています。これにより、正確な同値性の判定が可能になります。

先生と生徒の振り返り会話

生徒

「今回の内容で、equalsメソッドを正しくオーバーライドする方法が理解できました!」

先生

「素晴らしい!equalsメソッドをオーバーライドする際には、hashCodeメソッドとの整合性を保つことを忘れないでくださいね。」

生徒

「確かに、hashCodeをオーバーライドしないと、コレクションの動作に影響が出るんですよね?」

先生

「その通りです!たとえば、HashMapやHashSetでは、equalsとhashCodeが連動して動作します。これをきっちり理解しておけば、オブジェクトの比較やデータ管理がさらにスムーズになりますよ。」

生徒

「次回は、hashCodeメソッドについてもっと詳しく学びたいです!」

先生

「いいですね!それでは、次回も頑張りましょう!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Javaのequalsメソッドは何を比較するためのメソッドですか?

Javaのequalsメソッドは、2つのオブジェクトが同じ値(同値性)を持っているかどうかを比較するためのメソッドです。デフォルトでは参照の同一性を比較しますが、値を比較したい場合はオーバーライドが必要です。

JavaのObjectクラスにあるequalsメソッドの基本的な挙動はどうなっていますか?

JavaのObjectクラスに定義されているequalsメソッドは、2つの変数が同じインスタンスを指しているか(同一性)を比較し、一致すればtrueを返します。
JavaSilver試験対策の一覧へ
新着記事
Java
Java のカプセル化とは?データを安全に管理する仕組み
Java のカプセル化とは?データを安全に管理する仕組みを解説
Java
Java の継承の制約(final クラスや final メソッドの扱い)
Java の継承の制約を完全解説!final クラスや final メソッドの扱いを初心者向けにやさしく解説
AWS
【AWS】CLIで環境変数を使った安全な認証情報管理
【AWS CLI】環境変数で安全に認証情報を管理する方法を徹底解説!初心者向けセキュリティ対策ガイド
Java
Java のコンストラクタと継承(親クラスのコンストラクタを呼ぶ方法)
Java のコンストラクタと継承(親クラスのコンストラクタを呼ぶ方法)を初心者向けにやさしく解説
人気記事
AWS
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
AWS
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
AWS
インスタンスタイプの料金比較と最適な選び方(最新2026年版)
AWSインスタンスタイプの料金比較と最適な選び方!初心者でもわかる2025年最新ガイド
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク