Java 为什么hashCode的值是相同的,而所有的都是不同的字符串对象

Java 为什么hashCode的值是相同的,而所有的都是不同的字符串对象,java,Java,为什么hashCode的值相同,而所有对象都是不同的字符串对象: public class StringObj { public static void main(String[] args) { String s1="Jack"; String s2=new String("Jack"); String s3=new String("Jack"); System.out.println(s1.hashCode()

为什么hashCode的值相同,而所有对象都是不同的字符串对象:

public class StringObj {

    public static void main(String[] args) {

        String s1="Jack";

        String s2=new String("Jack");

        String s3=new String("Jack");

        System.out.println(s1.hashCode());

        System.out.println(s2.hashCode());

        System.out.println(s3.hashCode());

  }

}
Java for对象表示,如果一个对象
等于另一个对象()
,那么它必须具有相同的
hashCode()
。这是有道理的,因为据推测,两个对象都代表同一事物

从实际的角度来看,这是非常重要的。它允许您使用一个众所周知的字符串来写入和读取映射,而不必使用单例对象键。

Java for object说,如果一个对象
等于另一个对象
,那么它必须具有相同的
hashCode()
。这是有道理的,因为据推测,两个对象都代表同一事物


从实际的角度来看,这是非常重要的。它允许您使用已知字符串在地图中写入和读取,而不必使用单一对象键。

简短回答:

和的约定明确指出,如果两个对象的
等于
返回
true
,则这两个对象的
hashcode()
应该是相同的

请注意,这些字符串上的等号将返回
true
。因此,有必要使
hashCode
相同


长答案

报告说:

hashCode的总合同为:

  • 在Java应用程序的执行过程中,每当在同一对象上多次调用它时,
    hashCode
    方法必须一致地返回相同的整数,前提是不修改对象上的
    equals
    比较中使用的信息。此整数不需要在一次执行中保持一致 将一个应用程序转换为同一应用程序的另一个执行

  • 如果 根据equals(Object)方法,两个对象相等,然后 对两个对象中的每一个调用
    hashCode
    方法都必须产生 相同的整数结果

  • 如果两个对象是 根据
    equals(java.lang.Object)
    方法不相等,然后调用 两个对象上的
    hashCode
    方法必须产生不同的 整数结果。但是,程序员应该知道 为不相等的对象生成不同的整数结果可以提高 哈希表的性能

计算公式如下:

s[0]*31^(n-1)+s[1]*31^(n-2)+s[n-1]

使用
int
算术,其中
s[i]
是 字符串,
n
是字符串的长度,
^
表示 指数化。(空字符串的哈希值为零。)


因此,
String
hashCode()
使用
String
的值来计算
hashCode
。许多对象都会这样做。因此,只要内容相同,
hashCode
就会相同。这特别是因为这是合同规定的。

简短回答:

和的约定明确指出,如果两个对象的
等于
返回
true
,则这两个对象的
hashcode()
应该是相同的

请注意,这些字符串上的等号将返回
true
。因此,有必要使
hashCode
相同


长答案

报告说:

hashCode的总合同为:

  • 在Java应用程序的执行过程中,每当在同一对象上多次调用它时,
    hashCode
    方法必须一致地返回相同的整数,前提是不修改对象上的
    equals
    比较中使用的信息。此整数不需要在一次执行中保持一致 将一个应用程序转换为同一应用程序的另一个执行

  • 如果 根据equals(Object)方法,两个对象相等,然后 对两个对象中的每一个调用
    hashCode
    方法都必须产生 相同的整数结果

  • 如果两个对象是 根据
    equals(java.lang.Object)
    方法不相等,然后调用 两个对象上的
    hashCode
    方法必须产生不同的 整数结果。但是,程序员应该知道 为不相等的对象生成不同的整数结果可以提高 哈希表的性能

计算公式如下:

s[0]*31^(n-1)+s[1]*31^(n-2)+s[n-1]

使用
int
算术,其中
s[i]
是 字符串,
n
是字符串的长度,
^
表示 指数化。(空字符串的哈希值为零。)


因此,
String
hashCode()
使用
String
的值来计算
hashCode
。许多对象都会这样做。因此,只要内容相同,
hashCode
就会相同。这是因为这正是
hashCode
契约所要求的。

:如果两个对象根据equals(Object)方法相等,那么对这两个对象中的每一个调用hashCode方法必须产生相同的整数结果。对于String对象,hashCode基于内容。对于其他自定义对象,hashCode基于m/m地址。注意:如果两个对象根据equals(Object)方法相等,则对两个对象中的每个对象调用hashCode方法必须产生相同的整数结果。对于String对象,hashCode基于内容。对于其他自定义对象,hashCode基于m/m地址。