String hashCodes

时间:2014-03-20 08:01:39

标签: java string string-literals

小问题。

String s1 = "test";
String s2 = "test";

s1,s2都具有相同的hashCode值

String sn1 = new String("java");
String sn2 = new String("java");

所有人都说sn1和sn2有不同的hashCode值,而且这些是不同的对象

当我打印hashCode值时,它给出相同的值   这意味着sn1和sn2是否指向同一个对象?

4 个答案:

答案 0 :(得分:3)

如果对象相等,则散列码应等于(反之为不是)。由于

  sn1.equals(sn2) // true

我们可以得出结论

  sn1.hashCode() == sn2.hashCode() // true

答案 1 :(得分:1)

查看java代码以查看发生的情况通常很有用。

例如String#hashCode方法

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

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

正如您所看到的,结果是基于String的值,而不是其内存位置。

答案 2 :(得分:1)

如果您要比较字符串:

s1 == s2

然后你要比较String的指针(引用)。此引用不是您从String#hashCode方法获得的内容。

如果您要比较字符串:

s1.equals(s2)

然后方法String#equals使用Strings的{​​{3}}方法并比较结果。

自己尝试一下:

public class StringEquality {
    public static void main(String[] args) {
        String s1 = new String("java");
        String s2 = new String("java");

        // hashCodes
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());

        // equality of hashCodes
        System.out.println(s1.equals(s2));

        // references
        System.out.println(System.identityHashCode(s1));
        System.out.println(System.identityHashCode(s2));

        // equality of references
        System.out.println(s1 == s2);
    }
}

会打印出类似的内容:

3254818
3254818
true
1072624107
1615633431
false

答案 3 :(得分:0)

所有人? sn1sn2是不同的对象,但它们是相同的,因此它们具有相同的哈希码。