StringのhashCode()はなぜ0をキャッシュしないのでしょうか?
質問
Java 6 の String のソースコードで、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.
どのように解決するのですか?
あなたは何も心配しないでください。 この問題について考える方法を紹介します。
一年中文字列をハッシュ化するためだけに座っているようなアプリケーションがあるとします。 1000 個の文字列をすべてメモリ内に取り込み、ラウンドロビン方式で繰り返し 100 万回、その上で hashCode() を呼び出し、さらに 1000 個の新しい文字列を取得して、もう一度それを行うとします。
そして、文字列のハッシュコードがゼロである可能性が、実際には 1/2^32 よりはるかに大きいと仮定します。 それはきっと 多少 1/2^32よりも大きいと思いますが、それよりずっと悪い、1/2^16(平方根!これはもっと悪い!)だとしましょう。
この状況では、Oracle のエンジニアがこれらの文字列のハッシュ コードをキャッシュする方法を改善することで、他の誰よりも多くの利益を得ることができます。そこで、あなたは彼らに手紙を書いて、それを修正するように頼みます。そして彼らは、s.hashCode() がゼロであるときはいつでも、それが を即座に返します。 を返すようになりました (初回でも! 100% の改善です!)。そして、他のいかなる場合にも、パフォーマンスをまったく低下させることなく、これを実行したとしましょう。
万歳! これであなたのアプリは...えーと... 0.0015% 速くなりました!
丸1日かかっていたものが、たった23時間57分48秒になりました!
そして、私たちは、可能な限りの疑惑を与えるようにシナリオを設定したことを忘れないでください。
あなたにとって、これは価値があると思いますか?
EDITです。 数時間前にこれを投稿してから、私はハッシュコードゼロの2語フレーズを探すためにプロセッサの1つを野放しにしました。今のところ、bequirtle zorillo, chronogrammic schtoff, contusive cloisterlike, creashaks organzine, drumwood boulderhead, electroanalytic exercisable, and favosely nonconstruable と出てきています。これは約2^35の可能性のうち、完全な分布では8つしか表示されないと予想されます。完成する頃にはその数倍になっているのは明らかですが、突飛な数ではありません。それよりも、面白いバンド名やアルバム名がいくつか思いついたことが大きいです。 盗むなんてもってのほか!
関連
-
javaの非静的メソッドを静的に参照することができない
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] なぜlist.join(string)ではなくstring.join(list)なのでしょうか?
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
Javaでよくある構文エラー
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
シェルコマンドやスクリプトのJavaコール
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
コンストラクタDate()が未定義である問題
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
java 365*1000*60*60*24 計算問題
-
アクセス制限の解決方法: ---- in Java
-
Java 8 の文字列重複排除機能