在 HashMap 中,为什么阈值(调整大小的下一个大小值)是容量*负载因素。为什么不作为等于大小 or 地图容量.
例如,最初默认容量 = 16 ,负载系数 = 0.75 ,因此threshold = (capacity * load factor) = (16 * 0.75) = 12
.
当我们添加第 13 个元素时地图会调整大小为什么会这样,为什么地图的作者决定保留它capacity * load factor
(这是 12)?为什么与容量(16)不同。
为什么不保持阈值等于容量,以便仅在 hashmap 变满时才进行重新哈希?
Javadoc,Javadoc,Javadoc。那是你首先看的地方。上HashMap
它说:
作为一般规则,默认负载因子 (0.75) 提供了良好的权衡
时间成本和空间成本之间。较高的值会减少空间开销
但增加了查找成本(反映在大多数操作中)
HashMap类,包括get和put)。这
应获取地图中的预期条目数及其负载系数
在设置其初始容量时要考虑到这一点,以尽量减少
重新散列操作的数量。如果初始容量更大
比最大条目数除以负载因子,否
重新散列操作将会发生。
正如哈希映射的理论一样 - 如果你的映射已满,那么你就做了非常非常错误的事情。到那时你可能会在O(sqrt(N))
使用随机数据进行查找 -BAD. You never希望你的哈希图是满的。但是非常稀疏的地图会浪费太多空间(正如您所指出的),并且迭代需要很长时间。因此就有了should是一个负载因子,对于大多数用例来说小于 1。
注意:“浪费的空间”与地图的大小成正比,与负载系数成反比。然而,查找时间具有更复杂的预期性能函数。这意味着相同的负载因子不适用于不同大小的哈希图 - 因为这意味着不同的规模权衡。
有关权衡的总体概述可以在 Knuth“计算机编程的艺术”第 3 卷中找到。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)