マップを達成するために、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
。だから、無限ループがあります。