0

为什么哈希码值相同?

public static void main(String args[])
{
    String s1="abc";
    String s2=new String("abc");
    System.out.println("Hashcode s1-:"+ s1.hashCode());
    System.out.println("Hashcode s2-:"+ s2.hashCode());
    if(s1==s2){
        System.out.println("==true:");
    } 
}

输出

Hashcode s1-:96354
Hashcode s2-:96354
4

9 回答 9

7

两个相等对象的哈希码应该相等。

在这种情况下,对象是字符串,它们被认为是相等的,因为它们包含相同的字符序列“abc”。

如果您想要一个基于对象标识而不是相等的哈希码,请使用System.identityHashCode().

于 2013-03-18T09:28:04.950 回答
3

为什么他们不一样?是根据字符串的hashcode内容计算的,因此它们对于两者都是相同的。

==比较对象引用,并且因为你用于new String引用s2的引用不一样。

您应该使用该equals方法根据字符串的值来测试字符串的相等性。

于 2013-03-18T09:28:49.380 回答
2

因为哈希码是使用仅包含字符串中存在的字符的公式计算的。a 中的相同字符String将产生相同的哈希码

计算公式的Javadoc

于 2013-03-18T09:28:59.463 回答
0

String这是因为在 java 中是如何计算 hashcode 的。

检查javadoc:http ://docs.oracle.com/javase/6/docs/api/java/lang/String.html

而且,您的两个字符串相等,因此它们的哈希码必须相同。

于 2013-03-18T09:28:08.853 回答
0

这是代码......因此两个equals对象的结果是相同的:

public int hashCode() {
int h = hash;
    int len = count;
if (h == 0 && len > 0) {
    int off = offset;
    char val[] = value;

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }
        hash = h;
    }
    return h;
}
于 2013-03-18T09:28:52.117 回答
0

根据规则,那些 equals 方法返回 true 的对象应该具有相同的哈希码。

于 2013-03-18T09:29:10.977 回答
0

String类在其中实现了自己的hashcode方法。它的方法将计算哈希码为:s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

所以对于相同的字符序列哈希码将是相同的。

于 2013-03-18T09:31:58.233 回答
0

字符串的哈希码是根据其字符计算的,因此是equals()

它计算为

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

其中 s[i] 是每个字符0<=i<n,n 是它的长度。

您的两个字符串都具有相同的内容,因此哈希码是相同的。

于 2013-03-18T09:29:42.660 回答
0

如果它已经存在,JVM 不会创建新的 String,它只是返回引用。当您尝试更改其中一个变量中的实际字符串时,将创建一个新字符串。您可以在调试应用程序时检查它,String 对象将具有不同的内存地址,但内部的值将具有完全相同的内存地址。

于 2013-03-18T10:10:46.227 回答