の JavaDoc からHashMap
:
原則として、デフォルトの負荷係数 (.75) は、時間とスペースのコストの間の適切なトレードオフを提供します。値を大きくすると、領域のオーバーヘッドは減少しますが、ルックアップ コストが増加します (get と put を含む HashMap クラスのほとんどの操作に反映されます)。
値が大きい場合、ルックアップ コストが増加するのはなぜですか?
ハッシュ テーブルの負荷率は次のように定義されます。
n/s、格納されたエントリ数 n とテーブルのバケット配列のサイズ s の比率。
衝突の数が少ない場合、ハッシュ テーブルの高いパフォーマンスが維持されます。負荷率が高い場合、同じ数のエントリを格納するために必要なハッシュ バケットの数は少なくなるため、衝突の可能性が高くなります。
これは、HashTable が内部でどのように実装されているかに関係しており、ハッシュ コードを使用します。ハッシュ コードを計算するアルゴリズムは完全ではないため、いくつかの衝突が発生する可能性があります。ルックアップのパフォーマンス ...
デフォルトの負荷係数 (0.75)。
If declare load factor as
1 the restructuring process only happens when number of elements are exceeding the capacity of the HashMap.
負荷係数 0.75 は、式 (n/s、格納されたエントリ数 n とテーブルのバケット配列のサイズ s の比率) を使用してこのように解釈できます。
ハッシュ テーブルに格納する必要がある 75 個の値があり、それらを格納するための 100 個の空の配列ブロックがあるとします。ここでは、衝突の可能性が最小限に抑えられ、負荷係数は 0.75 です。
ここで、格納する値が 75 個あり、空の配列ブロックが 10 個しかない (負荷係数 7.5) とします。これは、衝突が発生し、検索時間が長くなる衝突解決技術を使用することを意味します。
75 個のエントリと 1000 個の空の配列ブロック (負荷係数 0.075) がある場合、多くの空のブロックが発生し、多くのスペースが浪費されます。
したがって経験則では、ロード ファクターの値が大きくなると検索時間が長くなり、0 に近づくほど、より多くのストレージ スペースが浪費されます。
したがって、それは時空のトレードオブです。