对HashMap如何在低级别上工作感到困惑

时间:2013-05-25 10:53:23

标签: java c arrays

我知道HashMaps通过获取对象的哈希码然后在数组中查找它来工作。令我困惑的是底层数组实际上是如何工作的。

让我们说,出于演示的目的,一个名为ObjectA的特定对象的哈希码是3.这是否意味着如果我将它添加到HashMap,HashMap有一个至少包含4个元素的数组?数组具有固定的大小,因此如果我将对象添加到哈希码为6的相同HashMap中,是否必须重建数组以具有6个值?例如:

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

2 个答案:

答案 0 :(得分: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,并且加载因子意味着只要hashmap的大小达到其当前大小的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

因此,为了避免在元素增长时重新扩展数据结构,最好在创建时显式给出hashmap的大小。

答案 1 :(得分:0)

你的理解稍微偏离,导致你的困惑:有一个数组数组,哈希码用于索引到外部数组。内部数组,包含您的对象的数组,就像一个列表一样填充,因为更多的对象到达目的地为同一个桶(这是外部数组的名称)。