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
メソッドを使用して、title
、author
、year
フィールドを組み合わせてハッシュコードを計算しています。このようにすることで、hashCode
メソッドが適切に実装され、ハッシュベースのデータ構造で正しく動作します。また、equals
メソッドもオーバーライドしています。equals
メソッドと hashCode
メソッドは密接に関連しており、同じオブジェクトが等しいと判定される場合は、同じハッシュコードを返すべきです。
hashCodeメソッド
hashCode
メソッドは、Javaの Object
クラスで定義されているメソッドの一つであり、オブジェクトのハッシュコードを返します。ハッシュコードは通常、オブジェクトの内部情報に基づいて計算され、異なるオブジェクトに異なるハッシュコードが割り当てられます。hashCode
メソッドは、主にハッシュテーブルなどのデータ構造で利用されます。
以下は、Object
クラスの hashCode
メソッドの宣言です。
public int hashCode()
hashCode
メソッドをオーバーライドする主な目的は、異なるオブジェクトが異なるハッシュコードを持つようにし、同じオブジェクトが等しいと判定される場合は同じハッシュコードを持つようにすることです。これにより、ハッシュベースのデータ構造(例: HashMap
、HashSet
)で正確に動作します。
hashCode
メソッドをオーバーライドする際の一般的な原則は以下の通りです。
equals
メソッドで等しいと判定されるオブジェクトは同じハッシュコードを返すようにする。- 異なるオブジェクトには異なるハッシュコードを返す。
ハッシュコードの計算には様々な方法がありますが、一般的にはオブジェクト内のフィールドを組み合わせてハッシュ値を生成します。Objects.hash
メソッドを使用すると、簡単に複数のフィールドを組み合わせたハッシュ値を計算できます。