两个String对象的哈希值的合并是否应与其串联的哈希值相同?我正在使用XOR ^运算符(如建议here)并获得了不同的结果。
我做错了什么?
String a = "A";
String b = "B";
String ab = a+b;
int i = a.hashCode() ^ b.hashCode();
System.out.println(
a.hashCode()+"\n"+
b.hashCode()+"\n"+
ab.hashCode()+"\n"
i);
答案 0 :(得分:1)
问题的前提是错误的。 hashCode()
唯一的硬性要求是两个相等的对象(即,调用a.equals(b)
返回true
)具有相同的哈希码(即a.hashCode() == b.hashCode()
返回true
}。
事实上,通过阅读String#hashCode()
's javadoc,它说明了:
String对象的哈希码计算为
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用int算术,其中s [i]是字符串的第i个字符,n是字符串的长度,^表示取幂。 (空字符串的哈希值为零。)
很明显,对两个字符串进行连接不会产生一个字符串,该字符串的哈希码等于构成它的字符串的哈希码的xor。