java - 为什么hashcode()返回相同的整数?

时间:2015-06-08 19:04:29

标签: java eclipse object hashcode

我不确定为什么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());

}

}

3 个答案:

答案 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中最强的等式,因为它比较了两个对象在内存中的位置。 ==就在它之后,它是一个逻辑相等,即使它们有不同的内存位置,两个对象也可以是equalsequal具有最弱的属性,如上所述。

答案 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()使用赋值引用的值(strstrONe)。这就是为什么两个hashCode()是等于的。

查看String class -

的hashCode()方法
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[];