"深度相等"测试和hashCode()

Jam*_*sev 3 java object

假设一个类MyClass有3个变量a,bc.该类还重写了使用Joshua Bloch方法计算返回值的hashCode().

假设如上所述,如果它们的哈希码匹配,那么假设MyClass()并且new MyClass()非常相等是否正确?

出于示例的目的,假设使用相同的参数初始化两个对象

Arn*_*len 5

当然不是.

hashCode需要为等效对象生成相同的值,但不同的对象可能会产生相同的值.因此,以下是正确(但效率低下)的hashCode实现:

public int hashCode()
{
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

即使你知道使用了特定的散列方法,但假设hashCode是完美的是一个坏主意:稍后,一些重构/子类可能会hashCode用其他东西替换实现.如果需要,请创建一个perfectHashCode始终返回完美哈希码的方法,并将其用于实现hashCode

回答你的初始问题:不,即使Bloch的方法afaics不会产生完美的hashCode,因为(因为包裹MAXINT)2个不同的路径可能最终碰撞到相同的哈希码.

这很容易想象:假设您的对象包含2个整数.哈希码只有1个整数.因此,对于2个整数的每个组合,它永远不会产生不同的值.

  • 阅读OP的第二句话:_"这个类还覆盖了hashCode(),它使用Joshua Bloch的方法计算返回值."_ (2认同)