小问题。
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是否指向同一个对象?
答案 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)
所有人? sn1
和sn2
是不同的对象,但它们是相同的,因此它们具有相同的哈希码。