假设一个类MyClass有3个变量a,b和c.该类还重写了使用Joshua Bloch方法计算返回值的hashCode().
假设如上所述,如果它们的哈希码匹配,那么假设MyClass()并且new MyClass()非常相等是否正确?
出于示例的目的,假设使用相同的参数初始化两个对象
当然不是.
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个整数的每个组合,它永远不会产生不同的值.