カテゴリ: JavaSilver試験対策 更新日: 2025/12/19

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メソッドが正しくオーバーライドされているため、期待通りの結果が得られます。

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. まとめ

7. まとめ
7. まとめ

今回は、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つのオブジェクトが同じ値(同値性)を持っているかどうかを比較するためのメソッドです。デフォルトでは参照の同一性を比較しますが、値を比較したい場合はオーバーライドが必要です。
JavaSilver試験対策の一覧へ
新着記事
IAM Identity Centerの許可セットとポリシーの関係を解説
IAM Identity Centerの許可セットとポリシーの関係を初心者向けにわかりやすく解説!
Java の正規表現で「数字」や「英字」だけをチェックする方法
Javaの正規表現で「数字」や「英字」だけをチェックする方法を初心者向けに完全解説
Java で正規表現を使う方法(Pattern クラスと Matcher クラス)
Javaで正規表現を使う方法を完全解説!PatternクラスとMatcherクラスを初心者向けにやさしく説明
FlutterでQRコードの生成・読み取りをする方法
FlutterでQRコードの生成・読み取りを実装する方法!初心者でもできるQRアプリ開発
人気記事
インスタンスタイプの料金比較と最適な選び方(最新2025年版)
AWSのインスタンスタイプの料金比較と最適な選び方【2025年最新版】
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説