-2

HashMaps は、オブジェクトのハッシュコードを取得し、それを配列で検索することで機能することを知っています。私が混乱しているのは、基になる配列が実際にどのように機能するかです。

デモ目的で、ObjectA と呼ばれる特定のオブジェクトのハッシュコードが 3 であるとしましょう。それを HashMap に追加すると、HashMap には少なくとも 4 つの要素を持つ配列があるということですか? 配列のサイズは固定されているため、ハッシュコードが 6 のオブジェクトを同じ HashMap に追加すると、配列を再構築して 6 つの値を持つようにする必要がありますか? 例:

hashmapArray[0] = null
hashmapArray[1] = null
hashmapArray[2] = null
hashmapArray[3] = ObjectA
4

2 に答える 2

1

hashmap の内部と、挿入の一部としてサイズがどのように変更されるかを次に示します。

java.util.HashMap.java

/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 16;

/**
 * The load factor used when none specified in constructor.
 */
static final float DEFAULT_LOAD_FACTOR = 0.75f;

配列のデフォルト サイズは 16 であり、負荷係数は、ハッシュマップのサイズが現在のサイズの 75%、つまり 12 に達するたびに、既存のデータ構造要素のハッシュコードを再計算することによってサイズを 2 倍にすることを意味します。

java.util.HashMap.java

/**
 * The maximum capacity, used if a higher value is implicitly specified
 * by either of the constructors with arguments.
 * MUST be a power of two <= 1<<30.
 */
static final int MAXIMUM_CAPACITY = 1 << 30;

ハッシュマップが展開できる最大サイズ、つまり 2^(30) = 1,073,741,824 まで

したがって、要素が大きくなるにつれてデータ構造が再ハッシュされるのを避けるには、ハッシュマップを作成するときに明示的にハッシュマップのサイズを指定するのがベスト プラクティスです。

于 2013-05-25T11:01:38.693 に答える