[英]Does hashCode() have to return a prime number?
hashCode()方法的签名是
public int hashCode(){
return x;
}
在这种情况下,x必须是int(primitive),但是plz谁能向我解释hashCode()返回的数字必须是质数,甚至是number ... etc或没有任何规范? 我问这个问题的原因是我在不同的ID中看到了它,自动生成的代码始终返回素数,所以我需要知道为什么吗?
提前致谢
实际上,有关hashCode()
约定非常明确:
返回对象的哈希码值。 支持此方法是为了使哈希表受益,例如
java.util.Hashtable
提供的哈希表。hashCode
的一般约定为:
- 在Java应用程序的执行过程中,只要在同一对象上多次调用它,则
hashCode
方法必须一致地返回相同的整数,前提是未修改该对象的equals比较中使用的信息。 从一个应用程序的执行到同一应用程序的另一执行,此整数不必保持一致。- 如果根据
equals(Object)
方法,两个对象相等,则在两个对象中的每个对象上调用hashCode
方法必须产生相同的整数结果。- 根据
equals(java.lang.Object)
方法,如果两个对象不相等,则不需要在两个对象中的每个对象上调用hashCode
方法必须产生不同的整数结果。 但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。在合理可行的范围内,由
Object
类定义的hashCode
方法确实为不同的对象返回不同的整数。 (通常通过将对象的内部地址转换为整数来实现,但是Java™编程语言不需要此实现技术。)
返回的内容取决于您,如果您愿意 ,可以为每个对象实例发出0
。 这可能是一个坏主意,但完全有效。 它绝不是素数。 如文档中所述,默认实现仅返回对象的内部地址,这与equals
检查引用相等性的默认实现一致。
通常,您可以通过在构成对象状态的字段上调用hashCode
方法来构造哈希,例如:
class Person {
private String firstName;
private String lastName;
@Override
public int hashCode() {
return firstName.hashCode() + lastName.hashCode();
}
}
但是,无论何时考虑对象状态表示的更改,都请记住同时更新hashCode
和equals
。
这与效率有关。
素数对于hashCode来说不是必须的,即使hashCode可以返回常量int。 但是为了提高效率,素数会带来良好的性能,而常量hashCode会导致最差的性能(哈希表会成为列表)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.