hashCode()是否必须返回素数?

时间:2010-04-22 07:59:35

标签: java hashcode

hashCode()方法的签名是

public int hashCode(){
    return x;
}

在这种情况下,x必须是一个int(原始),但PLZ可以向任何人解释这个数字 hashCode()返回的必须是素数,偶数...等或没有规范?我问这个问题背后的原因是我在不同的ID中看到它自动生成的代码总是返回素数,所以我需要知道为什么?

提前致谢

2 个答案:

答案 0 :(得分:3)

实际上有一个关于hashCode()的明确指定的合同:

  

返回对象的哈希码值。支持此方法是为了哈希表的好处,例如java.util.Hashtable提供的哈希表。   hashCode的一般合同是:

     
      
  • 每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,前提是不修改对象的等比较中使用的信息。从应用程序的一次执行到同一应用程序的另一次执行,该整数不需要保持一致。
  •   
  • 如果两个对象根据equals(Object)方法相等,则在两个对象中的每一个上调用hashCode方法必须生成相同的整数结果。
  •   
  • 如果两个对象根据equals(java.lang.Object)方法不相等则不是必需的,那么在两个对象中的每一个上调用hashCode方法必须产生不同的整数结果。但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。
  •   
     

尽可能合理,类hashCode定义的Object方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但Java™编程语言不需要此实现技术。)

     

- Documentation for the java.lang.Object class

您返回的内容取决于您,如果您想要,则可以为每个对象实例发出0。这可能是一个坏主意,但完全有效。它绝不是一个素数。如文档中所述,默认实现只返回对象的内部地址 - 这与检查引用相等性的equals的默认实现一致。

通常,您可以通过在构成对象状态的字段上调用hashCode方法来构造哈希,例如:

class Person {
    private String firstName;
    private String lastName;

    @Override
    public int hashCode() {
        return firstName.hashCode() + lastName.hashCode();
    }
}

不过,每当您认为对象状态的表示发生变化时,请记住更新hashCodeequals

答案 1 :(得分:0)

关于效率

Prime数不是hashCode必须的,甚至hashCode也可以返回一个常量int。 但是为了效率,素数导致良好的性能,而常量hashCode导致最差的性能(哈希表恶化为列表)。