カテゴリ: JavaSilver試験対策 更新日: 2026/06/27

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を返します。

Javaでequalsメソッドをオーバーライドする必要があるのはどんなときですか?

オブジェクトの値が等しいかどうかを比較したい場合、Javaのequalsメソッドをオーバーライドする必要があります。デフォルトのままだと参照しか比較できないからです。
JavaSilver試験対策の一覧へ
新着記事
Python
NumPyのdtypeとは?データ型の意味と仕組みを初心者向けに解説
NumPyのdtypeとは?データ型の意味と仕組みを初心者向けに徹底解説
Dart
Dartのクラスの作り方!定義・インスタンス生成の基礎
Dartのクラスの作り方を完全解説!初心者でも理解できるクラス定義とインスタンス生成の基礎
Java
Javaの同一性と同値性
Javaの同一性と同値性をわかりやすく解説!初心者向けの基礎知識
AWS
【AWS】s3 lsコマンドの使い方まとめ【オプション・ワイルドカード・日付指定】
【AWS】s3 lsコマンドの使い方まとめ【オプション・ワイルドカード・日付指定】
人気記事
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
AWS
【AWS】S3の料金体系まとめ!無料枠・課金ポイント・見積もり方法まで
【AWS】S3の料金体系まとめ!無料枠・課金ポイント・見積もり方法まで

🔌 USBポート不足を解消

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

UGREEN USB-Cハブを見る

※ Amazon広告リンク