【发布时间】:2017-04-26 16:27:05
【问题描述】:
我对此类哈希表的负载因子感到困惑。
我知道,为了计算负载因子,我们需要将条目数除以我们拥有的插槽数,当负载因子达到 0.75 时,它必须重新散列。
那么,这个哈希表的“整数数量”是多少?这些键占用的键总数或索引总数。
因为如果它是键的总数,那么重新散列的意义何在?这只会浪费空间和时间。
如果它是仅占用索引的总数,那么负载因子将是 2/5 = 0.4?
【问题讨论】:
-
条目的数量是键的数量,是的,因为每个键都有一个且只有一个关联值,一个条目是一个键/值对。对这样的map进行rehash的目的正是为了避免这种损害map性能的长链表,并更好地在桶之间分配条目。理想的分布是每个桶只有 0 或 1 个条目。
-
但是当这种冲突发生时,重新散列不会有帮助,对吧?只有改变 hashFunction 才有效?
-
没有。举个简单的例子,地图有 3 个桶,使用哈希码的简单模数来选择桶。假设地图中有 0、3 和 6。它们都将在桶 0 中,因为 0 % 3 == 0、3 % 3 == 0 和 6 % 3 == 0。现在让我们重新散列,并改用 7 个桶。现在 0 % 7 == 0,所以第一个键进入桶 0。3 % 7 == 3,所以 3 最终进入桶 3。6 % 7 == 6,所以键 6 进入桶 6 . 并且密钥现在理想地分布在存储桶中。
标签: java hashmap hashtable hashcode