-4

今天我正在尝试下面的代码,并期望两个 sysout 的输出不同。

public class StringDemo {


    public static void main(String[] args) {
        String s1 = new String("Hi");
        String s2 = new String("Hi");       
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
    }

}

但我得到了相同的价值。任何人都可以解释一下事情是如何运作的吗?

谢谢, 苏拉夫

4

5 回答 5

5

String有自己的hashCode()(谢天谢地)实现,它基于String. 也就是说,如果你有两个相等的字符串(不管它们是如何创建的),你最终会得到相同的hashCode().

这是JDK 7(简化)的实现:String.hashCode()

public int hashCode() {
    int off = offset;
    char val[] = value;
    int len = count;

     for (int i = 0; i < len; i++) {
         h = 31*h + val[off++];
    }
    return h;
}

如您所见,它仅基于String.

于 2013-01-10T12:33:17.857 回答
1

String的hashCode()规范由 JLS 规定,完全基于 String 的字符。它对于所有版本的 java 和所有 JVM 启动都是可预测和一致的。

于 2013-01-10T12:34:32.137 回答
1

来自http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#hashCode%28%29

public int hashCode()

    Returns a hash code for this string. The hash code for a String object is computed as

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


    using int arithmetic, where s[i] is the ith character of the string, n is the length of the string, and ^ indicates exponentiation. (The hash value of the empty string is zero.)

    Overrides:
        hashCode in class Object

    Returns:
        a hash code value for this object.
于 2013-01-10T12:35:20.777 回答
0

String 实现 hashCode 的方式是,对于相同的字符串,它将返回相同的 hashCode - 请注意,这对于没有实现 hashCode 的对象是不同的 - 它们通常为 hashCode 返回不同的值。

于 2013-01-10T12:33:13.650 回答
0

从字符串的源代码,

String 对象的哈希码计算为

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

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

于 2013-01-10T12:36:43.867 回答