1

次の 2 つのクラスがありFoo1HashMap. Foo1オブジェクトが等しい場合、2 つのオブジェクトは等しく、バイト配列が を満たす場合、オブジェクトは等しいFoo2です。Foo2Arrays.equals()

hashCode()のメソッドに対して何をすべきかよくわかりませんFoo1。各オブジェクトのハッシュコードを合計する必要があるだけFoo2ですか、それとも非効率ですか?

public class Foo1 {

  Foo2[] foo2_array;

  @Override
  public boolean equals(Object Other) {

     for (int i = 0; i < foo2_array.length; i++) {

        if (!foo2_array[i].equals(other.foo2_array[i])
          return false;
     }

     return true;
   }

   @Override
   public int hashCode() {

      // what to here?
   }
}

public class Foo2 {

  byte[] values;

  @Override
  public boolean equals(Object other) {

      return Arrays.equals(values, other.values);
  }

  @Override
  public int hashCode() {

     return Arrays.hashCode(values);
  }
}
4

2 に答える 2

5

契約を破らないように、hashcode同じ一連のプロパティを使用する必要があります。equals

Arrays.hashcodeで行われたように使用するだけですFoo2

また、使用できるequalsの各要素をループする必要はありませんArrays.equals

Foo2 equals は、Foo1.equals と同様に次のようになります。

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Foo1 other = (Foo1) obj;
        if (!Arrays.equals(foo2_array, other.foo2_array))
            return false;
        return true;
    }

および Foo1 ハッシュコードと同様のハッシュコード

    @Override
    public int hashCode() {
        return Arrays.hashCode(foo2_array);
    }

また、equals を実装している間は、同じ参照と null のオブジェクトの有効性をチェックします。

于 2012-05-25T04:36:56.797 に答える
0

基本的に、異なるオブジェクトが異なるハッシュ コードを持つ可能性を高める方法が必要です。

したがって、データによっては、配列内のすべての項目のハッシュを必ずしも合計する必要はありません。基本的には、「物事を絞り込むのに十分な」ものが必要です。

私はそれを次のように言います: あなたのデータについて、たとえば配列の中間値のハッシュ コードを取得できなかったのではないかと思わせるものはありますか? それとも、たとえば、最初、最後、および中間のアイテムのハッシュコードを組み合わせたものでしょうか?

(それができないと思わせるようなこと:たとえば、データに特別な機能があり、特定の狭い値のサブセットが配列の中央の要素として発生する場合。)

于 2012-05-25T04:39:01.540 に答える