Используется для кэширования hashCode
из String
. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
В коде, который вы разместили, он только пересчитывается, только когда значение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;
}