フィールド メンバーが 1 つだけの非常に単純なクラスがあります (例: String)。hashCode()
単純に返すように実装しても問題ありfieldMember.hashCode()
ませんか? または、フィールドのハッシュ コードを何らかの方法で操作する必要がありますか? また、それを操作する必要がある場合、それはなぜですか?
9 に答える
fieldMember がオブジェクトを一意に識別するための非常に優れた方法である場合、私はイエスと答えます。
掛け算、足し算、または xor 演算を行っても、それがよりユニークになるわけではありません。数学的には、単一の変数に定数関数を適用することになりますが、変数の可能な値の数は増えません。
この種の手法は、複数のハッシュコードを組み合わせて、衝突のリスクを比較的小さく保つのに役立ちます。単一のハッシュコードには何の関係もありません。
ええ、それはかなり標準的です。クラスがデータベースの行を反映している場合は、主キーのみを返します。
「fieldMember」変数がすでに「hashCode」関数を実装している場合は、親クラスから直接使用できます。「fieldMember」変数がカスタム クラス インスタンスである場合は、自分で正しく実装する必要があります。「hashCode」を実装するためのガイドラインとして、 java.lang.Object API ドキュメントをお読みください。
の実際の要件は 2 つだけです。1 つはインスタンスのハッシュ コードが等しいこと、もう 1 つはかなり高速にhashCode
実行されることです。最初の要件は、実際には最も重要なものです。それがなければ、何かをコレクションに入れてもそこに見つからない可能性があります。2 つ目は単にパフォーマンスの問題です。equals
hashCode
フィールドのハッシュ コード アルゴリズムが上記を満たしている場合、そのアルゴリズムもクラスに対して機能します。クラスequals
もそれらのフィールドがequals
.
他の誰かが述べたように、EffectiveJavaのアドバイスに従う必要があります。hashCode()メソッドをオーバーライドする場合は、equals()メソッドもオーバーライドする必要があります。さらに、2つの方法は一貫している必要があります。
適切なequals()メソッドとhashCode()メソッドの記述を簡素化するために、 ApacheCommonsLangのEqualsBuilderとHashCodeBuilderを使用します。
次に例を示します。
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
User other = (User) o;
return new EqualsBuilder()
.append(this.getUniqueId(), other.getUniqueId())
.isEquals();
}
public int hashCode() {
return new HashCodeBuilder()
.append(this.getUniqueId())
.toHashCode();
}
通常、このオブジェクトを *HashMap または *HashSet の要素のキーとして使用しない限り、hashCode() をオーバーライドする必要はありません。