我在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 Class从它的字符串文字中获取哈希值。登记/>
我推断,在字符串文字池中创建字符串文字时,计算此字符串文字的哈希值,而不是在创建字符串对象时计算。
我的问题是,这个字符串文字的哈希是如何以及在何处用Java计算的?
是否有一些原生实现?
答案 0 :(得分:1)
也许这就是你要找的东西:
它就在String中,将被缓存在一个内部变量中。不可否认,我不知道文字字符串中是否存在一些可以回避这种实现的魔法。
答案 1 :(得分:1)
如果我们查看code for String,我们会看到哈希的值最初为零。调用hashCode时,默认为hash 的值,除非为零,在这种情况下执行计算。那么什么时候哈希计算才能在String的复制构造函数中传递?
简单地说,它没有。它复制传递的字符串的哈希值,如果哈希已经计算,则该值将为非零。否则,新字符串实例的哈希值为0,并且两个实例都可能执行两次相同的计算。
这是一个合理的优化,因为如果没有必要,您不希望强制计算哈希码。真正的优化是回收字符串实例,以避免首先进行复制。
答案 2 :(得分:0)
文字String和构造函数创建的String实例之间的哈希计算没有区别。两者都使用String.hashCode()。
文字字符串默认汇集在字符串池中。请参阅String.intern()的javadoc说明。