Java 为什么字符串s1的哈希代码相同?=";猫;字符串s2=新字符串(“cat”)?
节目:Java 为什么字符串s1的哈希代码相同?=";猫;字符串s2=新字符串(“cat”)?,java,hashcode,Java,Hashcode,节目: 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()
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指向不同的内存地址,那么它们的哈希代码应该不同?请解释一下它们是如何相同的
如果S1和S2指向不同的内存地址,则它们的哈希代码应该不同?
不,哈希代码不是这样工作的。如果两个对象相等
,则它们的哈希代码也必须相等。他们坐在“记忆中的什么地方”并不重要
我建议阅读以下文章:哈希代码基于某个对象的内容 然而==比较引用,或者换句话说,比较内存中的“位置” 因此,两个对象可以很好地具有相同的内容(因为,嗯:相同的内容);但属于两个不同的参考 顺便问一下,为什么你总是用这个方法比较字符串;而非==。来自: 返回此字符串的哈希代码。字符串对象的哈希代码 计算为
s[0]*31^(n-1)+s[1]*31^(n-2)+…+s[n-1]
使用
int算术,其中s[i]是字符串的第i个字符,n是
字符串的长度,^表示幂运算
因为两个字符串中的值相同,所以hashcode是相同的
c的ASCII值为99,a的ASCII值为97,t的ASCII值为116。所以
hashcode of s1 = 99 * 31^2 + 97 * 31^1 + 116 = 95139 + 3007 + 116 = 98262.
s2的哈希代码也是98262。这就是相等值使hashcode相同的方式。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”),因此返回的整数是相同的。阅读文档。这不是哈希代码的工作方式。您在混合指针,而哈希代码是使用哈希策略的数字。它与内存位置无关,这对于哈希代码来说是一个非常糟糕的选择,因为在注释中提到的原因太多了。但这一点很好。