代码之家  ›  专栏  ›  技术社区  ›  subhashis

hashcode()必须返回素数吗?

  •  0
  • subhashis  · 技术社区  · 14 年前

    hashcode()方法的签名是

    public int hashCode(){
        return x;
    }
    

    在这种情况下,x必须是一个int(原语),但请大家解释一下 hashcode()返回的值必须是素数、偶数…等等,或者没有指定?我之所以问这个问题,是因为我在不同的id中看到过,自动生成的代码总是返回一个质数,所以我需要知道为什么?

    提前谢谢

    2 回复  |  直到 14 年前
        1
  •  3
  •   Joey Gumbo    14 年前

    实际上,有一个非常明确的合同 hashCode() :

    返回对象的哈希代码值。为了哈希表(如 java.util.Hashtable . 总承包合同 hashCode 是:

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

    只要合理可行, 哈希码 类定义的方法 Object 为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换成整数来实现的,但是这种实现技术不是Java Adx编程语言所需要的。)

    艾斯 Documentation for the java.lang.Object class

    如果你想回到那里 希望 到,你可以发射 0 对于每个对象实例。这可能是个坏主意,但完全正确。它决不是一个素数。如文档中所述,默认实现只返回对象的内部地址这与 equals 正在检查引用相等性。

    通常可以通过调用 哈希码 方法,该方法位于组成对象状态的字段上,例如:

    class Person {
        private String firstName;
        private String lastName;
    
        @Override
        public int hashCode() {
            return firstName.hashCode() + lastName.hashCode();
        }
    }
    

    记住要同时更新 哈希码 等于 但是,当您认为对象状态的表示形式发生变化时。

        2
  •  0
  •   卢声远 Shengyuan Lu    14 年前

    这是关于 效率 .

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