ハッシュマップレコード

マップを達成するために、AbstractMapの継承、複製可能で、Serializableインタフェース

初期パラメータ

デフォルトの初期容量16

1 << 30(百万約10)の最大容量

デフォルトの負荷係数0.75

容量負荷率のしきい値*

構造は倍modCount(ヴァル変更されません)に変更されます

コンストラクタ

HashMapの「(初期容量、負荷係数)

HashMapの「(初期容量):プラスデフォルトの負荷係数

HashMapの():デフォルトの初期容量、デフォルトの負荷係数

ハッシュマップ(MAP):新しいハッシュマップ、容量(着信マップ容量/負荷係数+ 1)とデフォルトの最大容量、マップハッシュマップの新たな要素を充填しました

方法

ハッシュ(H) 静的、デフォルトのアクセス。
複雑なこのビットは、単に書き留めh ^= (h >>> 20) ^ (h >>> 12);return h ^ (h >>> 7) ^ (h >>> 4);

indexFor(H、長さ):静的、デフォルトのアクセス。
な長さ-1バイナリビットが全て1(最上位ビットを除く)された後、さらに迅速なハイシールドHの効果を有する:H&(長さ1)ここでは2つの理由の電源の容量を見ることができます

GET(キー):キーにNULL、配列(インデックス0)の直接ルックアップテーブルである、アレイ内の非ヌル鍵、第1のハッシュテーブルインデックスし、リストエントリを取得

PUT(キー、値):鍵については、最初のテーブルに配列ヌルです。null以外のキーが、存在する場合、元の値にヴァルを更新し、新しいエントリは、エントリの後縁の新しい位置にチェーンの元のテーブルエントリが存在しない(すなわち、第1の補間方法を、私はjdk8テール補間を聞きました)。要素数が閾値よりも大きい、長さを倍にリサイズ

リサイズ(newCapacity)のデフォルトのアクセス:。
容量が最大しきい値整数、展開なしの最大容量を持っている場合。それ以外の場合は、配列に新しい配列、オリジナルの焼き直しの要素を作成します。

問題(インタビュアー審査オハイオ州)があるでしょう、それは無限ループに表示されるリンクリストです。この問題は、行にあるe.next = newTable[i];元の配列のリスト上のノードに位置E、上、NEWTABLE [I]は、新しいヘッドノードの拡張に対応するアレイ上(新しいリストに対応する)リストである(拡張であるように開始から終了まで元のリストの要素を、新しいリストが挿入される向かいます)。

e.next = E(無限ループ)、即ちNEWTABLE [I] = E A:場合がある上に2つのスレッドが同時にリサイズします。これはなぜ起こるのでしょうか?
状況はすでに始まっNEWTABLE電子の新しいリストに[i]がポイントである電子NEWTABLE [i]は、に割り当てられるコードの次の行に実行の唯一のスレッドである想像してみてください。これは、ケースE = Eには存在しません。

なぜマルチスレッドは、それが問題になるのでしょうか?あるので、現在のスレッド内の別のスレッドが実行できるようになりますe.next = newTable[i]、事前に行われたときnewTable[i]=eだから、無限ループがあります。

おすすめ

転載: www.cnblogs.com/so-easy/p/12159621.html