我看到了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/