2012-02-17 67 views
7

它出现在java.lang.String.java中,Java将只生成哈希码,然后在调用hashcode()之后将其存储,但为什么不直接在构造函数中创建哈希码?为什么懒惰生成Java String哈希码?

相关的代码:

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

如果您发现一个可以接受的答案,您可以勾选它让人们知道您有问题的答案。 – 2012-02-17 08:34:12

回答

13

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

+0

许多字符串将在其生命周期中得到相等性检查。如果两个不相等的字符串的哈希码已经被计算出来,那么检查两个不相等的字符串通常非常快此外,对于一些哈希码实现(包括Java中的哈希码实现),可以计算两个字符串在恒定时间(实际上是时间O(lgN))串联的哈希码,但是该数量是有界的,并且常数项可能相当小)。 – supercat 2012-11-12 21:56:24

0

这不是真正的论坛,这个问题可能会被关闭。您可以尝试在程序员.stackexchange.com中提问。

其中一个原因可能是计算hashCode并不便宜,只有在某些情况下才需要。

4

乔舒亚布洛赫称这种做法'活泼的单一检查'。

杰里米·曼森有它为什么做了出色的解释,为什么it'safe:on his blog

从本质上说,在施工时间,你跳过来计算哈希码节省一些时间。在多线程环境中,您将为此付费,因为多个线程可能会执行相同的计算。

0

2个原因:

1)计算hashCode()不便宜:是对字符串的长度O(n)复杂,当需要它,这样做的更好而已。

和:

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

0

将它放在构造函数中没有任何好处。但是当它在构造函数中时会有一个缺点。当一个字符串的hashCode永远不会被调用,那么计算就没有了。而当你调用hashCode()时,它会在两种情况下计算一次 - 只是在不同的地方和时间。