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

Java hashCode()是否必须返回素数?,java,hashcode,Java,Hashcode,hashCode()方法的签名为 public int hashCode(){ return x; } 在这种情况下,x必须是一个int(原语),但请大家向我解释一下,这个数字 hashCode()返回的值必须是素数、偶数……等等,否则没有规范?我问这个问题的原因是我在不同的ID中看到过它自动生成的代码总是返回一个素数,所以我需要知道为什么 提前感谢事实上,关于hashCode(),有一个非常明确的合同: 返回对象的哈希代码值。支持此方法是为了使哈希表受益,例如java.util.Ha

hashCode()方法的签名为

public int hashCode(){
    return x;
}
在这种情况下,x必须是一个int(原语),但请大家向我解释一下,这个数字 hashCode()返回的值必须是素数、偶数……等等,否则没有规范?我问这个问题的原因是我在不同的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();
    }
}

<>记住更新<代码> HASCODE 和<代码>等于,无论何时考虑对象状态的表示变化。

< P>实际上有一个非常明确的关于<代码> HASCODE()/<代码>:

的合同。 返回对象的哈希代码值。支持此方法是为了使哈希表受益,例如
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();
    }
}

<>记住更新<代码> hash码< /COD>和<代码>等于,无论何时考虑对象状态的表示变化。

< P>关于<强>效率>/P> 素数不是hashCode必须的,即使hashCode也可以返回常量int。
但就效率而言,素数导致了良好的性能,而常量哈希代码导致了最差的性能(哈希表恶化为一个列表)。

这与效率有关

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

您可以为问题添加
java
标记以对其进行分类。重复?您可以为您的问题向c添加
java
标记