java String hashcode缓存机制

标签 java hashcode

查看 Java 的 String 类,我们可以看到哈希码在第一次评估后被缓存。

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

其中 hash 是一个实例变量。我有一个问题,为什么我们需要 h 额外变量?

最佳答案

仅仅是因为 hash 值在循环中发生变化,没有中间临时变量的解决方案不是线程安全的。考虑在多个线程中调用此方法。

假设 thread-1 开始了 hash 计算并且它不再是 0。片刻之后 thread-2 在同一对象上调用相同的方法 hashCode() 并发现 hash 不是 0,但是 thread-1 还没有完成它的计算。结果,在 thread-2 中将使用错误的 hash(未完全计算)值。

关于java String hashcode缓存机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43653631/

相关文章:

带有 OAuth 的 Java 安全框架

java - 为 Java 7 任务编写代码的最佳方法需要先完成其他任务

java - JDialog在Windows 10上有一个隐式的最小宽度,如何绕过它?

Java Hashtable<Object, Someclass>,如果键是字符串?如果字符串相同,它将删除具有相同字符串的所有值

while循环中的java ResultSet由于某种原因不起作用

java - Kotlin JVM 中 null 的自定义注释

java - 我们是否必须为放在 HashMap 中的枚举覆盖 equals/hashcode

java - 哈希码,等于 java 中的契约(Contract)

java - 为什么Java中的equals()必须传递Object作为参数?

java - Java 设计 hashCode 方法