我不确定为什么hashCode()方法返回相同的值。有人可以提供更详细的解释吗?
源代码(Java):
public class Equality {
public static void main(String [] args)
{
String str = "String";
String strOne = new String("String");
System.out.println(str == strOne);
System.out.println(str.equals(strOne));
System.out.println(str.hashCode());
System.out.println(strOne.hashCode());
}
}
答案 0 :(得分:3)
来自Javadoc:
hashCode的一般合约是:
- 每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终如一 返回相同的整数,前提是equals中没有使用的信息 对象的比较被修改。不需要保留该整数 从一个应用程序的执行到另一个执行的一致性 相同的申请。
- 如果两个对象根据equals(Object)方法相等,则必须对两个对象中的每一个调用hashCode方法 产生相同的整数结果。
- 如果两个对象根据equals(java.lang.Object)方法不相等,则不需要调用hashCode方法 在两个对象中的每一个上必须产生不同的整数结果。 但是,程序员应该意识到产生了不同的 不等对象的整数结果可以提高性能 哈希表。
基本上,'#'
所以两个相同的字符串肯定会有相同的hashCode。
在我看来,你所期待的行为是a.equals(b) => a.hashCode() == b.hashCode()
的行为,但显然不是。{1}}。 ==
是Java中最强的等式,因为它比较了两个对象在内存中的位置。 ==
就在它之后,它是一个逻辑相等,即使它们有不同的内存位置,两个对象也可以是equals
。 equal
具有最弱的属性,如上所述。
答案 1 :(得分:1)
这应该有助于您理解。根据{{3}}(我相信Java 6/8应该相似或相同):
public int hashCode()
返回此字符串的哈希码。
String
对象的哈希码计算为s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用
int
算术,其中s[i]
是字符串的 i 字符,n
是字符串的长度,{{1}表示取幂。 (空字符串的哈希值为零。)
答案 2 :(得分:0)
hasCode()
方法应用于String
的值,即"字符串"两种情况。
虽然你已经创建了两个类似String
类型的引用 -
String str = "String";
String strOne = new String("String");
但是hashCode()使用赋值引用的值(str
和strONe
)。这就是为什么两个hashCode()
是等于的。
查看String
class -
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;
}
和value
声明如下 -
private final char value[];