为什么 String 的 hashCode() 不缓存 0?
我注意到在 String 的 Java 6 源代码中,hashCode 只缓存 0 以外的值。以下代码段显示了性能的差异:
public class Main{
static void test(String s) {
long start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
s.hashCode();
}
System.out.format("Took %d ms.%n", System.currentTimeMillis() - start);
}
public static void main(String[] args) {
String z = "Allocator redistricts; strict allocator redistricts strictly.";
test(z);
test(z.toUpperCase());
}
}
在 ideone.com 中运行此命令可得到以下输出:
Took 1470 ms.
Took 58 ms.
所以我的问题是:
- 为什么 String 的 hashCode() 不缓存 0?
- Java 字符串哈希为 0 的概率是多少?
- 避免每次为哈希为 0 的字符串重新计算哈希值会降低性能的最佳方法是什么?
- 这是缓存值的最佳做法方法吗?(即缓存除一个之外的所有内容?
为了您的娱乐,这里的每一行都是一个哈希为0的字符串:
pollinating sandboxes
amusement & hemophilias
schoolworks = perversive
electrolysissweeteners.net
constitutionalunstableness.net
grinnerslaphappier.org
BLEACHINGFEMININELY.NET
WWW.BUMRACEGOERS.ORG
WWW.RACCOONPRUDENTIALS.NET
Microcomputers: the unredeemed lollipop...
Incentively, my dear, I don't tessellate a derangement.
A person who never yodelled an apology, never preened vocalizing transsexuals.