java.lang.String类中私有“ hash”变量的使用是什么。它是私有的,每次调用hashcode方法时都会进行计算/重新计算。
答案 0 :(得分:2)
它用于缓存hashCode
中的String
。由于String
是不可变的,因此它的hashCode
永远不会改变,因此在已经计算完之后尝试重新计算是没有意义的。
在您发布的代码中,仅当hash
的值为0
时才重新计算,如果尚未计算hashCode
则可能会发生 >或,如果hashCode
中的String
实际上是0
,则可能!
例如,hashCode
中的"aardvark polycyclic bitmap"
是0
。
在Java 13中,似乎已经通过引入hashIsZero
字段来纠正了这一疏忽:
public int hashCode() {
// The hash or hashIsZero fields are subject to a benign data race,
// making it crucial to ensure that any observable result of the
// calculation in this method stays correct under any possible read of
// these fields. Necessary restrictions to allow this to be correct
// without explicit memory fences or similar concurrency primitives is
// that we can ever only write to one of these two fields for a given
// String instance, and that the computation is idempotent and derived
// from immutable state
int h = hash;
if (h == 0 && !hashIsZero) {
h = isLatin1() ? StringLatin1.hashCode(value)
: StringUTF16.hashCode(value);
if (h == 0) {
hashIsZero = true;
} else {
hash = h;
}
}
return h;
}