计划:
class JavaCode
{
public static void main (String[] args) throws java.lang.Exception
{
String s1 ="cat";
String s2 = new String("cat");
System.out.println(s1 == s2);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
}
输出
false
98262
98262
如果S1和S2指向不同的内存地址,那么哈希代码对它们应该是不同的?请解释它们是如何相同的?
答案 0 :(得分:3)
If S1 and S2 are pointing to different memory address, then Hash code should be different for them?
不,这不是哈希码的工作原理。如果两个对象是equal
,则它们的哈希码也必须相等。他们坐在“记忆中的位置”并不重要。
答案 1 :(得分:3)
哈希码基于某个对象的内容。
然而==比较引用,或换句话说:“位置”在内存中。
因此,两个对象可以具有相同的hashcode()
(因为,相同的内容);但属于两个不同的参考文献。
顺便说一句,为什么你总是总是使用equals()
方法来比较字符串;而不是==。
答案 2 :(得分:2)
来自documentation of hashCode():
返回此字符串的哈希码。 String对象的哈希码 计算为
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int arithmetic,其中s [i]是字符串的第i个字符,n是 字符串的长度,^表示取幂。
由于两个字符串中的值都相同,因此哈希码相同。
c的ASCII值为99,a为97,t为116.所以,
hashcode of s1 = 99 * 31^2 + 97 * 31^1 + 116 = 95139 + 3007 + 116 = 98262.
s2的哈希码也是98262.这就是等值使哈希码相同的方式。
答案 3 :(得分:0)
hashCode()
是String
类的公共实例方法,它根据内容返回整数值。
class JavaCode
{
public static void main (String[] args) throws java.lang.Exception
{
String s1 ="cat";
String s2 = new String("cat");
System.out.println(s1 == s2);
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
}
}
在上面的代码中,s1
和s2
的内容相同(“cat”),因此返回的整数是相同的。