1

私は非常に大きなSet不変オブジェクトを持っているので、構築時にそれらに一意のハッシュコードを割り当てることを考えています。

private static int counter = Integer.MIN_VALUE;

private final double foo;
private final double bar;
private final int hashCode;

public MyImmutableObject(double foo, double bar)
{
    counter++;
    this.foo = foo;
    this.bar = bar;
    this.hashCode = counter;
}

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

   /**
    * Unneeded override of equals since its the same as in
    * Object, but shown for demonstration purposes. 
    */
@Override
public boolean equals(final Object obj)
{
    return this == obj;
}

このようにして、2つの32の一意のキーがあるため、キーの分散度を可能な限り高くすることができます。もちろん、これは、オブジェクトがそれ自体と等しいだけなので、このタイプの2つのオブジェクトが等しくなることは決してないことも意味します。

編集:オブジェクトは、sのキーとしても使用されますMap

これは可能ですか?見逃した隠れた罠はありますか?

4

1 に答える 1

4

これは可能ですか?見逃した隠しトラップはありますか?

スレッドセーフ?もちろん、それを回避するために使用できますAtomicInteger

それからそれの無意味さもあります、本当に。組み込みのハッシュ コードは、余分な作業をしなくても (オブジェクトごとに余分な 4 バイトを取らずに)、一意にかなり近くなります。等価性の意味を変更していないことを考えると (基本的には等価性を参照しています)、これを行う正当な理由があるとは思えません。

于 2012-04-19T19:21:51.387 に答える