为什么hashcode与字符串对象相同???
我正在努力理解字符串池是如何工作的。我经历了很多网站,最后我现在更加困惑了。让我在这里放下我的疑虑。有人帮助我理解它们。
class cov {
public static void main(String[] args) {
String s = "abc"; //Object on string pool
System.out.println(s.hashCode());
String str = new String("abc"); //This statement does two things
System.out.println(str.hashCode());
}
}
答案 0 :(得分:3)
字符串的hashCode()
方法是根据它包含的字符计算的。如果两个String对象包含具有相同大小且相同顺序的相同字符,那么它们将具有相同的hashCode()
。
答案 1 :(得分:3)
String
类有一个hashCode
方法,可以根据内容而不是内存位置计算哈希码。因此,如果两个字符串相同(但不一定相同),则它们将具有相同的哈希码。
如果不是这种情况,HashSet<String>
这样的结构将无法使用 - 每个新的String
都不会出现在集合中,即使String
与{{1}}已经添加了相同的字符。
答案 2 :(得分:1)
以下是用于生成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;
}
如其他答案中所述,hashCode是从String的内容生成的,而不是它所在的位置。例如堆栈或常量池