2

我正在编写如下所示的代码:

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

上述代码的输出是否正确?

4

3 回答 3

7

是的,这是正确的输出。of基于字符串的内容hashCodeString以非常具体的方式,记录在上面链接的文档中)。

由于s1s2s3s4具有相同的内容(“hi”),它们都返回相同的 hashCode。

这实际上是必需的,因为返回的对象a.equals(b)需要true返回a.hashCode()和相同的值b.hashCode()

请注意,相反的情况(即“具有相同哈希码的对象必须相等”)是不正确的,甚至不能在一般情况下完成(只需考虑可能的String值比值多得多int,请参阅鸽笼原理)。

于 2012-12-05T12:21:26.600 回答
3

你所有的字符串都是equal有意义的,它们具有相同的哈希码。这是Object中定义的哈希码合同的一部分:

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

于 2012-12-05T12:21:52.240 回答
1

如果我错了,有人纠正我,但我认为是的,这是正确的输出,因为你得到了字符串“hi”而不是字符串对象的 hascode。这正是 hashcode-method 应该做的。

于 2012-12-05T12:22:00.720 回答