7

在 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;
}

大多数情况下可以放在构造函数中。

4

5 回答 5

13

为什么要花时间生成一个很可能不会被使用的哈希码?大多数字符串都是在没有调用 hashcode() 的情况下构造、使用然后进行垃圾收集的。

于 2012-02-17T00:32:33.117 回答
5

Joshua Bloch 称这种做法为“活泼的单次检查”。

杰里米·曼森 (Jeremy Manson) 很好地解释了为什么这样做以及为什么这样做是安全的:在他的博客上

本质上,在构建时,您可以通过跳过计算哈希码来节省一些时间。在多线程环境中,您将为此付出代价,因为多个线程可能会执行相同的计算。

于 2012-02-17T00:38:25.327 回答
0

这不是真正的正确论坛,问题可能会被关闭。您可以尝试在programmers.stackexchange.com 中询问。

一个原因可能是计算 hashCode 并不便宜,而且仅在某些情况下才需要。

于 2012-02-17T00:32:44.200 回答
0

2个原因:

1)计算hashCode()并不便宜:O(n)字符串长度的复杂性,所以最好只在需要时才做。

和:

2)字符串实例是不可变的:因为它们永远不会改变,你总是hashCode()最多计算一次。

于 2012-02-17T00:43:07.737 回答
0

将它放在构造函数中没有任何好处。但是当它在构造函数中时有一个缺点。当从不调用 String 的 hashCode 时,计算就白费了。当您调用 hashCode() 时,它在两种情况下都会计算一次 - 只是在不同的地点和时间。

于 2012-02-17T00:44:41.603 回答