Reputation: 432
what is the use of private "hash" variable in java.lang.String class. It is private and calculated/re-calculated every time hashcode method is called.
Upvotes: 3
Views: 691
Reputation: 29680
It's used to cache the hashCode
of the String
. Because String
is immutable, its hashCode
will never change, so attempting to recalculate it after it's already been calculated is pointless.
In the code that you've posted, it's only recalculated when the value of hash
is 0
, which can either occur if the hashCode
hasn't been calculated yet or if the hashCode
of the String
is actually 0
, which is possible!
For example, the hashCode
of "aardvark polycyclic bitmap"
is 0
.
This oversight seems to have been corrected in Java 13 with the introduction of a hashIsZero
field:
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;
}
Upvotes: 5