我用String s = "java"和String ss = new("java")两种方式创建字符串,然后都用hashCode()方法获得他们的hashCode,发现这2个的hashCode是一样的,这是为什么?获得hashCode是引用变量的还是什么?两个引用变量s和ss都是指向的常量池中的"java" 这个对象吗?ss难道不是指向的heap中开辟的那个新的"java"对象?搞不懂了。
调试欢乐多
//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;
}
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
因此字符串内容相同的两个String对象,哪怕它们是不同的实例,hashCode也会是相同的。