(スペシャルエディション)HashMapのハッシュでの(オブジェクトキー)原則として、なぜ(ハッシュコード>>> 16)。

私たちは皆知っている(jdk1.8)HashMapの配列インデックスは、HashMapのコアアルゴリズムを計算しています。小扁HashMapのは困惑参照するには、ソースコード内のハッシュ(オブジェクトキー)メソッドを参照するには、今日。小扁は、読み込まれ、関連するブログ、ハッシュ(オブジェクトキー)のも、HashMapの英語の説明を見つけ、百度を尋ねました。しかし、単に言うためにも、可能な限り、詳細に話すことはありませんでした。小扁今日は何これらの2つの問題を詳細に説明して。

HashMapのハッシュ(オブジェクトキー)原則として、なぜそれを行う?
ハッシュ(オブジェクトキー)法の下で見て、基本的に誰もが詳細に理解しますが、このステップを知ることができます(H = key.hashCode())^ (H >> > 16)非常に少ない理由の人々 。

 静的最終int型のハッシュ(オブジェクトキー){
         int型、H。
        リターン(キー== nullの)?0:(H = key.hashCode())^(H >>> 16 )。
 }

まず、このメソッドの戻り値はハッシュ値です。なぜ(key.hashCodeを返さない)のですか?また、(H >>> 16)XORを有します。あなたは、まず以下の点を知っている必要があります。

必要な知識:^演算子>>>計算&オペレーション。

1. hは>>> 16は、使用が何であるということです何?
Hはハッシュコードです。>>> H 16時間は、次を示す(符号なし右シフト>>>)、16を除去するために高いです。

0000  0100  1011  0011   1101  1111  1110  0001
  
>>> 16  
 
0000  0000  0000  0000   0000  0100  1011  0011

2.なぜH = key.hashCode())及び(H >>> 16)XORは
、本明細書の方法を述べindexFor、そこindexFor(int型の長さ、でjdk1.7のint hの)方法に依存します。そこにはjdk1.8はありませんが、原則は変わっていません。1.7ソースコード下記をご覧

タブ付き1.8 [(N - 1)&ハッシュ]の場所ではなく同じ原理。

静的 INT indexFor(INT H、INT 長){
     戻り H&(長さ- 1 )。
}

このメソッドは、値が配列添字である返します。私たちは通常、多くの使用マップデータは、地図の下にほとんどのケースではありません。ここで(長さ1)&相

しかし、ほとんどの場合ので、長さが65,536未満であることが一般的に少ない2 ^ 16以上です。実行時間結果は常に低い16ビット(長さ1) - 計算、したがってH&(長さ1)を返します。以下の実施例(ハッシュコードバイトは4つ)

実施例1:長さ8の検証を容易にするためには、想定されます。デフォルトの容量は16のHashMapであります

長さ= 8;(長さ1)= 7; 111バイナリに変換。

仮定すると、変換キーハッシュコード= 78897121バイナリである:100101100111101111111100001、及び(長さ1)&次のように算出します

    0000  0100  1011  0011  1101  1111  1110  発明の属する技術分野
 オペレーショナル
 
    0000  0000  0000  0000  0000  0000  0000  0111
  
=    0000  0000  0000  0000  0000  0000  0000  発明の属する技術分野(小数は1であるため、添字1)

計算の本質は、次のとおり001と111の動作。であり、3つの低ハッシュ値計算の長さ。あなたが低い3つのランダムなハッシュ値を聞かせている場合、その結果は、それが高いXORで許可されている、低3つのよりランダムなハッシュ値を作成する方法にもよりランダム&です。

追加の知識:

下位3つの長= 8、標準の演算結果は、ハッシュ値に依存する場合

計算の下位4つの標準長さ= 16回の結果は、ハッシュ値に依存する場合

低い5つの標準長さ= 32は、ハッシュ値の計算の結果に依存したとき

N番目のパワー長= 2のNビットは、添字演算結果は、ハッシュ値に依存します。

3.原因要約
起因と(長さ1)操作、長さ16の大部分は電源に2未満です。ハッシュコードは、常に下位16ビットであるので、計算に関与する(又はより低いです)。高い16ビットの動作も関与している場合は、より多くのハッシュインデックスを取得します。

これはあまりそれは、計算に関与しているか、高い高い16個の、16以上であるようにします。だから、ハッシュ(オブジェクトキー)メソッドを持っています。彼のhashCode()と、独自の高い16 ^演算子をしてみましょう。したがって、(H >>> 16)(高いハッシュコードと彼の16を得る)^操作。

4.なぜ代わりに^&のと|
&以来と| ^、0または1、いなくてもコンセプトに偏った結果を作成し、使用しますので。

ハッシュ(オブジェクトキー)さがある理由です。



おすすめ

転載: www.cnblogs.com/yuexiaoyun/p/12158914.html