如何计算字符串文字池中字符串文字的哈希值?

时间:2016-02-10 14:15:15

标签: 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 Class从它的字符串文字中获取哈希值。登记/> 我推断,在字符串文字池中创建字符串文字时,计算此字符串文字的哈希值,而不是在创建字符串对象时计算。 我的问题是,这个字符串文字的哈希是如何以及在何处用Java计算的? 是否有一些原生实现?

3 个答案:

答案 0 :(得分:1)

也许这就是你要找的东西:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java#String.hashCode%28%29

它就在String中,将被缓存在一个内部变量中。不可否认,我不知道文字字符串中是否存在一些可以回避这种实现的魔法。

答案 1 :(得分:1)

如果我们查看code for String,我们会看到哈希的值最初为零。调用hashCode时,默认为hash 的值,除非为零,在这种情况下执行计算。那么什么时候哈希计算才能在String的复制构造函数中传递?

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

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

答案 2 :(得分:0)

文字String和构造函数创建的String实例之间的哈希计算没有区别。两者都使用String.hashCode()。

文字字符串默认汇集在字符串池中。请参阅String.intern()的javadoc说明。