重新定义equals()

时间:2014-04-19 13:02:15

标签: java

这是C. Horstmann的Core Java摘录。 +++++ hashCode方法应该返回一个整数(可以是负数)。只是结合起来 实例字段的哈希码,以便不同对象的哈希码可能 广泛分散。 例如,这是Employee类的hashCode方法:

class Employee
{
    public int hashCode()
    {
        return 7 * name.hashCode() + 11 * new Double(salary).hashCode() + 13 * hireDay.hashCode();
    }
. . .
}

+++

我无法理解这些7,11和13.他们刚从帽子里拔出来了吗?没有它们,结果(检查两个对象的相等性)似乎是一样的。

3 个答案:

答案 0 :(得分:3)

通常,测试相等性不会使用哈希码。

7,11,13都是素数。这降低了两个不同员工具有相同哈希码的可能性(因为theorem of Bézout)。

事实上,我建议(扩大获得的哈希)使用更大但非连续的素数,例如1039,2011,32029。在Linux上,来自包/usr/games/primes的{​​{1}}实用程序非常有用。

重要的是,如果两个比较相等,则它们具有相同的哈希码。 出于性能原因,您希望散列代码被广泛分布(因此,如果两个东西不相等,它们的哈希码通常应该不同),以降低hash collision的概率。

hash tables上阅读wikipage。

答案 1 :(得分:2)

这些数字是素数。

你不想只是添加哈希码,因为它会让你有更多的冲突。

e.g。

情况A:foo =" bla",bar =" 111"

情况B:foo =" 111",bar =" bla"

这意味着foo.hash() + bar.hash()将在两种情况下返回相同的值。你使用素数,因为函数f:N / 2 ^ 32 - > N / 2 ^ 32:x - >如果p是素数,则x * p(mod 2 ^ 32)是双射的。 2.(如果乘以256而你会丢失比特......)

如果你使用像哈希集这样的东西,那么只能避免碰撞。

答案 2 :(得分:0)

与素数相乘是一种常见的优化,通常由IDE为您完成。如果不需要优化,我就不会这样做。