HashMap的initialCapacity究竟做了什么?

时间:2015-05-07 11:28:45

标签: java hashmap

如果我指定HashMap map = new HashMap(1); 然后它会包含只有1个桶的HashMap,并且无论我的哈希算法有多好,所有添加到HashMap的元素都将留在那个桶中?

2 个答案:

答案 0 :(得分:0)

构造函数采用零个,一个或两个参数:initialCapacityloadFactor。如果超过初始容量,将添加更多存储桶。负载因子决定了添加的时间和数量。

查看documentation,尤其是以下段落:

  

HashMap的一个实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数,初始容量只是创建哈希表时的容量。加载因子是在自动增加容量之前允许哈希表获取的完整程度的度量。当哈希表中的条目数超过加载因子和当前容量的乘积时,哈希表将被重新哈希(即,重建内部数据结构),以便哈希表具有大约两倍的桶数。 / p>      

作为一般规则,默认负载系数(.75)在时间和空间成本之间提供了良好的权衡。较高的值会减少空间开销,但会增加查找成本(反映在HashMap类的大多数操作中,包括get和put)。在设置其初始容量时,应考虑映射中的预期条目数及其加载因子,以便最小化重新散列操作的数量。如果初始容量大于最大条目数除以负载因子,则不会发生任何重新连接操作。

答案 1 :(得分:0)

hashMap的大小由两个因素决定:

  1. 负载系数
  2. 初始尺寸
  3. 加载因子的默认值为0.75,初始大小的默认值为16.这意味着当您使用新的HashMap()初始化hashMap时,桶数组的大小将为16.一旦大小达到16的0.75(这是12),hashmap的大小将自动递增。

    如果使用HashMap(int var1)初始化HashMap,则将加载因子设置为其默认值(0.75),初始大小将设置为var1。

    也可以使用新的HashMap(int var1,int var2)初始化HashMap,在这种情况下,开发人员将设置大小和加载因子。如果您对要插入地图的键值对的数量有所了解,最好使用这种类型的初始化。如果你没有想法,那么使用新的HashMap()。

    如果您使用用户定义的类作为键,请始终确保重写键类中的hashCode和equals方法。这是因为key的哈希码用于从hashmap插入和检索数据。