hashCode和equals与String的关系

时间:2014-03-21 03:00:15

标签: java string

String s1 = new String("abc");//it is created at heap area
String s2 = "abc";//it is created string constant pool 
System.out.println(s1==s2);//false
System.out.println(s1.hashCode());same hashCode
System.out.println(s2.hashCode());same hashCode

最后两行给出了相同的hashCode(),但是对象是不同的。在创建s1对象时,它在堆区域中创建,s2对象在string常量池中创建。但两者都给出相同的hashCode.ie my疑问?

5 个答案:

答案 0 :(得分:3)

String javadoc

  

返回此字符串的哈希码。 String对象的哈希码   计算为

     

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

     

使用int算术,其中s[i]是字符串的ith字符,n是字符串的长度   字符串,^表示取幂。 (空的哈希值   string为零。)

由于String个对象具有相同的字符,因此它们的哈希码相等。

答案 1 :(得分:2)

因为String#hashCode()基于字符内容,而不是对象标识:

/**
 * Returns a hash code for this string. The hash code for a
 * <code>String</code> object is computed as
 * <blockquote><pre>
 * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
 * </pre></blockquote>
 * using <code>int</code> arithmetic, where <code>s[i]</code> is the
 * <i>i</i>th character of the string, <code>n</code> is the length of
 * the string, and <code>^</code> indicates exponentiation.
 * (The hash value of the empty string is zero.)
 *
 * @return  a hash code value for this object.
 */
public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

答案 2 :(得分:0)

最简单的答案:根据定义,当两个对象相等时 - 这里定义为具有相同的内容 - 它们应该具有相同的hashCode。这称为这些方法的合同。例如,违反合同的类将不能用作HashMap中的键,否则通常会被破坏。

答案 3 :(得分:0)

这一行:

String s1 = new String("abc");

创建一个新的String对象。这一行:

String s2 =&#34; abc&#34 ;;

创建一个插入到字符串池的String对象(String常量"abc"的所有使用都将使用池中的同一个对象。)

==比较两个操作数是否是相同的对象,因此s1 == s2符合预期的false


不同对象的散列码不需要不同。如果哈希代码具有相同的,则必须是相同的 - 即a.equals(b)。如果两个字符串对象具有相同的,那么它们将具有相同的哈希码:哈希码与预期的相同。

答案 4 :(得分:-1)

“==”运算符比较对象在内存中的位置

我想你应该阅读&#34; .equals&#34;之间的区别。和&#34; ==&#34;。请参阅以下链接

http://www.programmerinterview.com/index.php/java-questions/java-whats-the-difference-between-equals-and/