8

デカルト空間のノードなど、不変オブジェクトがあります。クラスは不変であるためhashCode、非常に高速なハッシュのためにキャッシュします。

private final int hashCode;

private final double x, y, z;

public Node(final double x, final double y, final double z)
{
    this.x = x;
    this.y = y;
    this.z = z;
    this.hashCode = Objects.hashCode(this.x, this.y, this.z);
}

@Override
public boolean equals(final Object obj)
{
    if (this == obj) { return true; }
    if (obj == null) { return false; }
    if (!(obj instanceof Node)) { return false; }
    final Node other = (Node) obj;
    return Objects.equal(this.x, other.x) && Objects.equal(this.y, other.y) && Objects.equal(this.z, other.z);
}

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

hashCode一意であり、クラスのすべてのフィールドに依存しており、クラスは不変であるため、にNode基づいて等価性のみをチェックするのは正しいでしょうhashCodeか?

@Override
public boolean equals(final Object obj)
{
    if (this == obj) { return true; }
    if (obj == null) { return false; }
    if (!(obj instanceof Node)) { return false; }
    final Node other = (Node) obj;
    return this.hashCode == other.hashCode;
}

equals()これは、 and のプロパティとそれらの相互作用について書いたすべての単体テストに合格しますがhashCode()、何か不足しているのではないでしょうか?

注:Objects.hashCode()Objects.equal()は、それぞれのメソッドに役立つ Guava クラスです。

4

2 に答える 2

17

いいえ; それはうまくいきません。

2 32の可能なハッシュコードと 2 192の可能な値があります。

于 2012-04-18T00:24:40.857 に答える
2

いいえ、しかし..

ハッシュコードをチェックして、オブジェクトが等しくないかどうかを確認し、そこでパフォーマンスを向上させることができると思います。

public boolean equals(final Object obj) {
   if (this == obj) { return true; }
   if (!(obj instanceof Node)) { return false; }
   final Node other = (Node) obj;

   if (this.hashCode != other.hashCode) {
      return false; // If hashcodes differ, we're sure the objects are not equal
   }
   // remainder of the actual equals implementation
}

もちろん、これはほとんどの比較が false になる場合にのみパフォーマンスを向上させます。等しいオブジェクトの場合、これによりパフォーマンスが低下します。あなたの例(3つの値だけを比較する)では、これはお勧めしません。

于 2012-09-05T18:10:02.407 に答える