为什么 String s1= "cat" 和 String s2= new String("cat") 的哈希码相同?

Why hash code is same for String s1= "cat" and String s2= new String("cat")?

程序:

 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指向不同的内存地址,那么它们的哈希码应该不同?请解释它们如何相同?

If S1 and S2 are pointing to different memory address, then Hash code should be different for them?

不,哈希码不是这样工作的。如果两个对象是 equal,它们的哈希码也必须相等。 "where in memory" 他们坐着没关系。

我建议通读以下文章:http://www.javaworld.com/article/2074996/hashcode-and-equals-method-in-java-object---a-pragmatic-concept.html

哈希码基于某些对象的内容

而 == 比较引用,或者换句话说:"positions" 在内存中。

因此两个对象很可能具有相同的 hashcode()(因为,嗯:相同的内容);但属于两个不同的引用。

顺便说一句,为什么您总是总是使用 equals() 方法比较字符串;而不是==。

来自documentation of hashCode()

Returns a hash code for this string. The hash code for a String object is computed as s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] using int arithmetic, where s[i] is the ith character of the string, n is the length of the string, and ^ indicates exponentiation.

由于两个字符串中的值相同,因此哈希码相同。

c 的 ASCII 值为 99,a 为 97,t 为 116。因此,

hashcode of s1 = 99 * 31^2 + 97 * 31^1 + 116 = 95139 + 3007 + 116 = 98262.

s2 的哈希码也将是 98262。这就是相等的值使哈希码相同的方式。

hashCode()Stringclass的public实例方法,return根据内容取整型值

    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());
      }
     }

在上面的代码中,s1s2的内容相同("cat"),所以returned的整数是相同的。