Java 测试字符串的哈希代码
我正在编写如下代码:Java 测试字符串的哈希代码,java,string,hashcode,Java,String,Hashcode,我正在编写如下代码: String s1=new String("hi"); System.out.println(s1.hashCode()); String s2=new String("hi"); System.out.println(s2.hashCode()); String s3=s1.intern(); String s4=s2.intern(); System.out.println(s3.hashCode()); System.out.println(s4.hashCode()
String s1=new String("hi");
System.out.println(s1.hashCode());
String s2=new String("hi");
System.out.println(s2.hashCode());
String s3=s1.intern();
String s4=s2.intern();
System.out.println(s3.hashCode());
System.out.println(s4.hashCode());
当我运行代码时,会为所有变量打印相同的哈希代码:
3329
3329
3329
3329
上述代码的输出正确吗?是的,输出正确。基于字符串的内容(以一种非常具体的方式,记录在上面链接的文档中) 由于
s1
、s2
、s3
和s4
都具有相同的内容(“hi”),因此它们都返回相同的hashCode
这实际上是必需的,因为a.equals(b)
返回true
的对象必须为a.hashCode()
和b.hashCode()返回相同的值
注意,相反的(即“同一个哈希代码的对象必须相等”)是不正确的,甚至不能在一般情况下进行(简单地认为,存在比代码< int 值更大的可能<代码>字符串< /代码>值,请参阅)。这是hashcode合同的一部分,定义如下:
如果根据equals(Object)方法两个对象相等,那么对两个对象中的每一个调用hashCode方法必须产生相同的整数结果
如果我错了,有人会纠正我,但我认为是的,这是正确的输出,因为您得到了字符串“hi”的hascode,而不是字符串对象的hascode。这正是hashcode方法应该做的。有理由怀疑JVM的输出吗?您期望得到什么?您还可以尝试“iJ”.hashCode()
来确认不同的字符串也可以生成相同的哈希。