2

私は次のようなクラスを持っています

public class Hash {
    int age;
    int id;
    String name;
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Hash other = (Hash) obj;
        if (id != other.id)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }


}

これで、name と id の 2 つの属性のみを使用して .equals メソッドを生成しましたが、私の質問は次のとおりです。.hashCode() メソッドを実装する良い方法は何でしょう。

  1. 名前と ID のみを使用する
  2. 名前、年齢、ID の 3 つすべてを使用します。

両方の長所と短所は何ですか?

4

4 に答える 4

3

ハッシュコードを計算するための重要なルールは、実装にも関連する情報のみを使用する必要があるということです。equals()

ageメソッドで使用しないため、 !equalsで使用するのは間違っています。hashCode理由は非常に簡単です。

  • 「id=1, age=2, name=foo」と「id=1, age=3, name=foo」という属性を持つ 2 つのオブジェクト o1 と o2 を想像してください。
  • 呼び出しequals()は戻りますtrue
  • hashCode()ただし、( を使用する実装で) を呼び出すとage、2 つの異なる値が返されます。

これは、そのようなすべての情報を使用する必要があるという意味ではありません。場合によっては、サブセットのみを使用する方が有利な場合があります (たとえば、2 つのオブジェクトの唯一の違いである可能性が低い、大きくてハッシュしにくいオブジェクトがある場合)。

最も原始的で正しい実装は次のようになります。

public int hashCode() {
    return 0;
}

それは正しいですが、非常に非効率的です (すべてのオブジェクトが同じ値にハッシュされるため、明らかに!)。

于 2013-10-18T10:15:34.710 に答える
0

あまり考えずに使用します:apache'sHashCodeBuilder

このクラスを使用するには、次のようにコードを記述します。

 public class Person {
   String name;
   int age;
   boolean smoker;
   ...

   public int hashCode() {
     // you pick a hard-coded, randomly chosen, non-zero, odd number
     // ideally different for each class
     return new HashCodeBuilder(17, 37).
       append(name).
       append(age).
       append(smoker).
       toHashCode();
   }
 }

答え: クラスの各オブジェクトのみnameid一意に識別し、 との比較に一貫性がありequal()ますか? はいの場合、 2つではなく3 つの属性を使用する必要があるのはなぜですか?

このHashing it out Articleをチェックしてください。少し古いですが詳細です。

于 2013-10-18T10:13:18.167 に答える