java String哈希码缓存机制

use*_*623 9 java hashcode

查看Java的String类,我们可以看到哈希代码在第一次评估后被缓存.

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}
Run Code Online (Sandbox Code Playgroud)

hash实例变量在哪里.我有一个问题,为什么我们需要h额外的变量?

And*_*niy 5

仅仅因为hash循环中的值更改和没有中间临时变量的解决方案不是线程安全的.考虑在多个线程中调用此方法.

thread-1开始hash计算,它0不再是.稍后一些小的时刻会thread-2在同hashCode()一个对象上调用相同的方法,但是看hash不到0,但thread-1还没有完成计算.结果,将使用thread-2错误的hash(未完全计算的)值.


Mar*_*rio 5

这是一种简单且廉价的同步机制。

如果一个线程第一次调用 hashCode() ,并且在第一个线程计算哈希值时第二个线程再次调用它,则如果直接使用,第二个线程将返回错误的哈希值(第一个线程中计算的中间值)属性。

  • 完全正确,卢。在这种情况下,与在字符串生命周期内不需要任何同步机制的好处相比,计算两次哈希在开始时的影响较小。 (2认同)