java - "hash"字符串类中的变量

原文 标签 java jvm

java.lang.String 类中私有(private)“哈希”变量的用途是什么。它是私有(private)的,每次调用 hashcode 方法时都会计算/重新计算。

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

最佳答案

它用于缓存 hashCodeString .因为String是不可变的,它的 hashCode永远不会改变,因此在计算完之后尝试重新计算是没有意义的。

在您发布的代码中,它仅在 hash 的值时重新计算。是 0 ,如果 hashCode还没计算如果 hashCodeString实际上是 0 ,这是可能的!

例如,hashCode"aardvark polycyclic bitmap"0 .

Java 13 中似乎已经纠正了这种疏忽,引入了 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;
}

关于java - "hash"字符串类中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58424530/

相关文章:

java - LRU 和 MRU 缓存驱逐策略的排序键数据结构

java - 如何为Java 7中的现有国家/地区代码向java.util.Currency添加新的Currency?

clojure - 如何检查 clojure 函数的 JVM 字节码?

java - 在 Java 中,是 substring(int k, int y) 还是 substring(int k) 更高效?

java - Hotspot JVM 是将代码编译成机器码还是简单地运行它

java - JVM中的内存分配

java - jpa manytomany如何添加重复项

java - 将CSV文件导出到数组中

java - 当 Firebase 实时数据库上的数据发生变化时,获取实时数据变化更新

java - 解释 Java *client* 安全问题和 *server* 安全问题之间的区别