查看 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;
}
其中 hash
是一个实例变量。我有一个问题,为什么我们需要 h
额外变量?
最佳答案
仅仅是因为 hash
值在循环中发生变化,没有中间临时变量的解决方案不是线程安全的。考虑在多个线程中调用此方法。
假设 thread-1
开始了 hash
计算并且它不再是 0
。片刻之后 thread-2
在同一对象上调用相同的方法 hashCode()
并发现 hash
不是 0
,但是 thread-1
还没有完成它的计算。结果,在 thread-2
中将使用错误的 hash
(未完全计算)值。
关于java String hashcode缓存机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43653631/