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”),因此返回的整数是相同的。

阅读文档。这不是哈希代码的工作方式。您在混合指针,而哈希代码是使用哈希策略的数字。它与内存位置无关,这对于哈希代码来说是一个非常糟糕的选择,因为在注释中提到的原因太多了。但这一点很好。