String类中的“哈希”变量

时间:2019-10-17 03:34:29

标签: java jvm

java.lang.String类中私有“ hash”变量的使用是什么。它是私有的,每次调用hashcode方法时都会进行计算/重新计算。

http://hg.openjdk.java.net/jdk7u/jdk7u6/jdk/file/8c2c5d63a17e/src/share/classes/java/lang/String.java

1 个答案:

答案 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;
}