java - 字符串常量池中的字符串常量的哈希是如何计算的?

标签 java string hash

我看到了Java中String类的实现,它的构造函数是这样的

public String(String var1) {
        this.value = var1.value;
        this.hash = var1.hash;
    }

所以,如果你愿意的话

String s1 = "String";
String s2 = new String("String");

即使 s1 和 s2 是两个不同的对象,s1.hashCode() == s2.hashCode() 仍按预期返回 true,因为在它的构造函数中, String类从它的字符串文字中获取哈希值。
我推断出这个字符串文字的哈希值是在字符串文字池中创建字符串文字时计算的,而不是在创建字符串对象时计算的。
我的问题是,在 Java 中如何以及在哪里计算这个字符串文字的哈希值?
有一些 native 实现吗?

最佳答案

如果我们看一下code for String ,我们看到哈希值最初为零。当调用 hashCode 时,它​​默认为哈希值除非它为零,在这种情况下执行计算。那么哈希值在传入 String 的复制构造函数之前什么时候计算的呢?

简单地说,事实并非如此。它复制传递的字符串的哈希值,如果计算了哈希值,该值将不为零。否则,新字符串实例的哈希值将为 0,并且两个实例可能会执行相同的计算两次。

这是一个合理的优化,因为如果没有必要,您不会希望强制计算哈希代码。真正的优化是回收字符串实例,以避免首先进行复制。

关于java - 字符串常量池中的字符串常量的哈希是如何计算的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35317546/

相关文章:

Java HashSet 使用指定的方法

java - java中的散列json

java - 引用的延迟加载

perl - 在 Perl 中,如何从散列中获取任意值?

java - 如何使用 Selenium Webdriver 和 Java 禁用 Firefox 中的不安全密码警告

r - 在 R 中不使用循环对元素求和

php mp3字符串错误

string - 我正在使用 Java 通过在代码中动态生成查询来从 Elasticsearch 中获取一些记录。查询需要一个字符串

java - Intellij IDEA 代码覆盖率错误地显示低于 100%

java - 具有 JNI 依赖的 Clojure 本地 Maven 存储库