为什么懒惰生成Java String哈希码?

时间:2012-02-17 00:29:55

标签: java string lazy-initialization

它出现在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;
}

大部分都可以放在构造函数中。

5 个答案:

答案 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()时,它会在两种情况下计算一次 - 只是在不同的地方和时间。