Java 为什么hashCode的值是相同的,而所有的都是不同的字符串对象
为什么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()
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地址。