为什么哈希码对于String s1 =“cat”和String s2 = new String(“cat”)是相同的?

时间:2016-09-01 18:18:46

标签: 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());
        System.out.println(s2.hashCode());
     }
  }

输出

false
98262
98262

如果S1和S2指向不同的内存地址,那么哈希代码对它们应该是不同的?请解释它们是如何相同的?

4 个答案:

答案 0 :(得分:3)

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

不,这不是哈希码的工作原理。如果两个对象是equal,则它们的哈希码也必须相等。他们坐在“记忆中的位置”并不重要。

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

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

在上面的代码中,s1s2的内容相同(“cat”),因此返回的整数是相同的。