014 継承(オブジェクトクラスの継承) 039 解答例

import java.util.Objects;

public class Book {
    private String title;
    private String author;
    private int year;

    // コンストラクタなどは省略

    @Override
    public int hashCode() {
        return Objects.hash(title, author, year);
    }

    // equals メソッドもオーバーライドすることが推奨されます
    // equals の実装は hashCode の計算に関連しています

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Book otherBook = (Book) obj;
        return year == otherBook.year &&
               Objects.equals(title, otherBook.title) &&
               Objects.equals(author, otherBook.author);
    }

    // その他のメソッドやフィールドは省略
}

この例では、Objects.hash メソッドを使用して、titleauthoryear フィールドを組み合わせてハッシュコードを計算しています。このようにすることで、hashCode メソッドが適切に実装され、ハッシュベースのデータ構造で正しく動作します。また、equals メソッドもオーバーライドしています。equals メソッドと hashCode メソッドは密接に関連しており、同じオブジェクトが等しいと判定される場合は、同じハッシュコードを返すべきです。

hashCodeメソッド

hashCode メソッドは、Javaの Object クラスで定義されているメソッドの一つであり、オブジェクトのハッシュコードを返します。ハッシュコードは通常、オブジェクトの内部情報に基づいて計算され、異なるオブジェクトに異なるハッシュコードが割り当てられます。hashCode メソッドは、主にハッシュテーブルなどのデータ構造で利用されます。

以下は、Object クラスの hashCode メソッドの宣言です。

public int hashCode()

hashCode メソッドをオーバーライドする主な目的は、異なるオブジェクトが異なるハッシュコードを持つようにし、同じオブジェクトが等しいと判定される場合は同じハッシュコードを持つようにすることです。これにより、ハッシュベースのデータ構造(例: HashMapHashSet)で正確に動作します。

hashCode メソッドをオーバーライドする際の一般的な原則は以下の通りです。

  1. equals メソッドで等しいと判定されるオブジェクトは同じハッシュコードを返すようにする。
  2. 異なるオブジェクトには異なるハッシュコードを返す。

ハッシュコードの計算には様々な方法がありますが、一般的にはオブジェクト内のフィールドを組み合わせてハッシュ値を生成します。Objects.hash メソッドを使用すると、簡単に複数のフィールドを組み合わせたハッシュ値を計算できます。

「014 継承」問題集リスト