-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,它将通过重新计算现有数据结构元素的哈希码使其大小翻倍。

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;

它表示 hashmap 可以扩展的最大大小,即直到 2^(30) = 1,073,741,824

因此,为了避免在元素增长时重新散列数据结构,最好在创建散列图时明确给出散列图的大小。

于 2013-05-25T11:01:38.693 回答
0

您的理解略有偏差,导致您感到困惑:有一个数组数组,并且哈希码用于索引外部数组。内部数组,即包含您的对象的数组,就像一个列表一样被填满,因为更多的对象到达同一个存储桶(这是外部数组的名称)。

于 2013-05-25T11:03:19.383 回答