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 にハッシュされるたびにハッシュ値を再計算するというパフォーマンスの低下を回避する最善の方法は何ですか?
- これは値をキャッシュするベストプラクティスの方法ですか? (つまり、1 つを除いてすべてをキャッシュしますか?)
お楽しみに、ここの各行は 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.