HashMap拡張

1993 ワード

概要HashMapのsizeが(容量*ロードファクタ)以上の場合、拡張の操作がトリガーされます.これはコストのかかる操作です.なぜ拡張するのですか?HashMapのデフォルトの容量は16で、要素がHashMapに追加されるにつれて、hashの衝突が発生する確率が高くなり、バケツごとに対応するチェーンテーブルが長くなり、クエリーの性能に影響します.毎回チェーンテーブルを遍歴する必要があります.比較対象が等しいかどうかは、要素が見つかるまでです.
クエリーのパフォーマンスを向上させるためには、拡張のみ可能であり、hashの競合を低減し、要素のkeyをできるだけ均一に分布させることができます.
かくようきじゅんてん
ロードファクタの既定値は0.75です.
static final float DEFAULT_LOAD_FACTOR = 0.75f;

容量のデフォルト値は16です.
 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //   16
HashMapは、作成時に容量およびロードファクタを指定できる構造パラメータを提供する.
 public HashMap(int initialCapacity, float loadFactor)

デフォルトでは、HashMapsizeが16*0.75=12以上になると、各Entry(またはバケツ)に少なくとも1つの要素がある場合に拡張されます.

 if ((size >= threshold) && (null != table[bucketIndex])) {
            resize(2 * table.length);
            hash = (null != key) ? hash(key) : 0;
            bucketIndex = indexFor(hash, table.length);
}

拡容時、容器容量が2倍になる
 resize(2 * table.length);

拡張の際には要素の配列下付き文字1を再計算し、新しいEntry配列2を再割り当て、元の要素の新しい配列中の下付き文字を再計算する必要がある(比較消費リソース)