ハッシュアルゴリズムでJDK 1.8およびアルゴリズムを最適化する方法を探していますか?
ソースコードのセクションの後に内部// JDK 1.8のHashMap
静的 最終 int型のハッシュ(オブジェクトキー){ int型、H。 リターン(キー== nullの)?0:(H = key.hashCode())^(H >>> 16 )。 }
16点のレベル位置が操作を必要とします:
例えば、キーのハッシュ値が存在します
コスト:1,111,111,111,111,111 1,111,101,001,111,100
右16:0,000,000,000,000,000 1,111,111,111,111,111
排他的論理和演算:1,111,111,111,111,111 0,000,010,110,000,011 - > int型の値をハッシュ値に変換される表し
アルゴリズムの最適化への対応:
(N - 1)・ハッシュ - >配列インデックス内の位置を算出します
モジュロ演算性能悪化、アレイ、2のn乗の配列の長さ、ハッシュ・アドレッシングのプロセス最適化するために - モジュロnのより高い動作性能と効果としてハッシュ結果と(N 1)。
その動作の下部コア16
最適化のハッシュアルゴリズム:各ハッシュ値のために、彼の低い16で、その16のレベルは、排他的だったか16個の機能のレベルを維持しながら、彼は16低い、ハッシュ値以降の出現のいくつかを回避するために試してみましょうということ競合は、それが配列の同じ位置になることがあります。
どのようにHashMapのハッシュ衝突問題を解決しますか?
ハッシュの衝突、赤黒木リスト+、O(n)およびO(LOGN)
map.putとmap.get - (回避ハッシュ衝突へ)>ハッシュアルゴリズムの最適化、パフォーマンスの最適化に取り組みます
、パフォーマンスが比較的悪くなるリストを横断する可能性があり、あなたのリストが非常に長いと仮定し、O(n)の
最適化は、特定の長さに到達した後、リストの長さがあれば、実際には、リスト要素を見つけるために、赤黒木、赤黒木のトラバースに変換され、この時間O(LOGN)、パフォーマンスがチェーンの一部よりも高くなります。
HashMapのは、どのように拡張についての話ですか?
2膨張のn乗。16,32,64。。。
焼き直し:
AND演算 - アレイ32の拡張=長さの後にあれば、再び新しい1のアレイと、各ハッシュ値の長さ、すなわち、各ハッシュ値に対して対処。
N-1 0000 0000 0000 0000 0000 0000 000 1 1111
HASH1 1111 1111 1111 1111 0000 1111 000 0 0101
結果0000&0000 0000 0000 0000 0000 000 0 0101 = 5(インデックス= 5の位置)
N-1 0000 0000 0000 0000 0000 0000 000 1 1111
0000 1111 000 1111 1111 1111 1111 HASH2 1 0101
結果&0000 0000 0000 0000 0000 000 0000 。1 0101 =(位置指標= 21)21
、元のインデックスがない場合よりもっと出てくる場合はビットで二進結果が1以上、、インデックスは+ oldCap、方法により、それぞれの新しいハッシュと、時間の焼き直しを回避することかどうかを決定します.LENGTHモジュラスアレイは、性能が高い弾性率、高い演奏操作位置ではありません。
参考文献:
インターネットのJavaエンジニアインタビュー暴行(第3四半期) - 中国フペルジン