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 个唯一密钥。当然,这也意味着这种类型的两个对象永远不会相等,因为一个对象只会与它自己相等。

编辑:对象也用作Maps 中的键。

这可能吗?有没有我错过的隐藏陷阱?

4

1 回答 1

4

这可能吗?有没有我错过的隐藏陷阱?

线程安全,一方面?当然,你可以用它AtomicInteger来解决这个问题。

然后还有它的无意义,真的。无需您做任何额外的工作(并且每个对象占用额外的 4 个字节),内置哈希码将非常接近唯一。鉴于您没有改变平等的含义(它基本上仍然是参考平等),我看不出有什么好的理由这样做。

于 2012-04-19T19:21:51.387 回答