我正在编写如下代码:
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
上述代码的输出是否正确?
答案 0 :(得分:7)
是的,这是正确的输出。 The hashCode
of String
基于字符串的内容(以非常具体的方式,在上面链接的文档中记录)。
由于s1
,s2
,s3
和s4
都具有相同的内容(" hi"),它们都返回相同的hashCode
实际上需要,因为a.equals(b)
返回true
的对象需要为{{1}返回相同的值}和a.hashCode()
。
请注意,相反的(即#34;具有相同哈希码的对象必须相等")不正确并且甚至无法完成(只需考虑有b.hashCode()
个值可能比String
值多得多,请参阅the pigeonhole principle)。
答案 1 :(得分:3)
所有字符串都是equal
,因此它们具有相同的哈希码是有意义的。这是哈希码定义in Object的合同的一部分:
如果两个对象根据equals(Object)方法相等,则对两个对象中的每个对象调用hashCode方法必须生成相同的整数结果。
答案 2 :(得分:1)