2015-09-27 4 views
5

通常はHashMapのメソッドputTreeVal()が使用されますか?HashMapのputTreeVal()メソッドJDK8

ときはput(K key, V value)を呼び出した後に、このケースをん:通常行わ

else if (p instanceof TreeNode) 
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); 

+1

実装について質問していますか?同じハッシュバケット内の複数のエントリのストレージが、単一リンクリストからバイナリツリーにアップグレードされました。これは、クラッシュがある場合、ハッシュバケット内のツリーにエントリを追加するために使用されます。 –

+1

これは実装の詳細なので、将来のリリースで変更される可能性があることに注意してください。 – the8472

答えて

6

ハッシュマップが機能する通常の方法は、ハッシュコードに基づいて新しいキーのビンを選択するビン(またはバケット)の数を増やすことです。

限られた数のビンがあるので、いくつかのキーが同じビンになる可能性があるという問題があります。ビンはリストです。あなたはO(1)時間にビンに行くことができますが、リスト内でリニアに検索する必要があります。そのリストが長くなると、ハッシュテーブルのパフォーマンスが低下します。

したがって、HashMapの現在の実装では、ビンが長くなりすぎるとビン構造を変更することによってこの問題が改善されます。ビンにすでに8つ以上のエントリがあり、ビンの数が64より大きい場合、ビンはリストから赤黒のツリーに変換されます。赤黒の木はバランスの取れた探索木です。これは、それがO(log n)になることを意味し、これはO(n)よりも好ましい。

これで、ビンに値を入力すると、それがどのビンであるかをチェックする必要があります。プレーン・リストの場合はリストに追加し、ツリーの場合はツリーに追加してバランスを取ってください。

+0

ありがとう@RealSkeptic、非常に良い。私は、バケットの一つを圧倒して、それをデバッグし、その要素が同じバケットに入ってtreeifyBin()を起動するようなhashCode()とequils()のペアを書くのは難しいことを明らかにしました。 –