它出现在java.lang.String.java中,Java只会在调用hashcode()之后生成哈希码,然后存储它,但为什么不在构造函数中创建哈希码呢?
相关代码:
if (h == 0 && count > 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
大部分都可以放在构造函数中。
答案 0 :(得分:13)
为什么要花时间生成最不可能使用的哈希码?大多数字符串都被构造,使用,然后在没有调用hashcode()的情况下进行垃圾收集。
答案 1 :(得分:4)
约书亚布洛赫将这种做法称为“活泼的单一检查”。
Jeremy Manson非常好地解释了为什么会这样做以及为什么它是安全的:on his blog
从本质上讲,在构建时,您可以通过跳过计算哈希码来节省一些时间。在多线程环境中,您将为此付费,因为多个线程可能会执行相同的计算。
答案 2 :(得分:0)
这不是真正正确的论坛,问题可能会被关闭。您可以尝试在programmers.stackexchange.com中询问。
一个原因可能是计算hashCode并不便宜,只在某些情况下才需要。
答案 3 :(得分:0)
2个原因:
1)计算hashCode()
并不便宜:字符串长度是O(n)
复杂度,所以只有在需要它时才能做得更好。
和
2)字符串实例是不可变的:因为它们永远不会改变,所以你总是最多一次计算hashCode()
。
答案 4 :(得分:0)
将它放在构造函数中没有任何好处。但是当它出现在构造函数中时会有一个缺点。当从未调用String的hashCode时,计算完全没有。当你调用hashCode()时,它会在两种情况下计算一次 - 只是在不同的地方和时间。