HashMap拡張
概要
クエリーのパフォーマンスを向上させるためには、拡張のみ可能であり、
かくようきじゅんてん
ロードファクタの既定値は0.75です.
容量のデフォルト値は16です.
デフォルトでは、
拡容時、容器容量が2倍になる
拡張の際には要素の配列下付き文字1を再計算し、新しいEntry配列2を再割り当て、元の要素の新しい配列中の下付き文字を再計算する必要がある(比較消費リソース)
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)
デフォルトでは、
HashMap
のsize
が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を再割り当て、元の要素の新しい配列中の下付き文字を再計算する必要がある(比較消費リソース)