【问题标题】:How elements are grouped in a ConcurrentHashMap based on load factor如何根据负载因子在 ConcurrentHashMap 中对元素进行分组
【发布时间】:2016-01-06 17:04:23
【问题描述】:

在我读到的一些帖子中:

ConcurrentHashMap 根据负载因子按邻近度对元素进行分组

  1. 这种分组是如何发生的?

  2. 假设我重写了 hashCode() 函数,使其始终返回 1。现在 loadfactorhigherlower 值如何影响插入进入 ConcurrentHashMap ?.

  3. 现在我重写 hashCode() 函数,使其始终返回不同的哈希码。现在loadfactor较高较低值将如何影响插入到 ConcurrentHashMap 中?

【问题讨论】:

    标签: java hashmap concurrenthashmap load-factor


    【解决方案1】:

    hashmap 本质上是一个列表数组。例如,假设给定的 hashmap 有一个包含 100 个列表的数组。当您向其中添加内容时,会为该对象计算 hashCode。然后该值的模数和列表的数量(在本例中为 100)用于确定将其添加到哪个列表。因此,如果您添加一个哈希码为 13 的对象,它会被添加到列表 13。如果您添加一个哈希码为 12303512 的对象,它会被添加到列表 12。

    加载因子告诉 hashmap 何时增加列表的数量。是根据整个地图的物品数量和当前容量来决定的。

    在哈希码始终返回 1 的第一个场景中,无论有多少列表,您的对象最终都会出现在同一个列表中(这很糟糕。)在第二个场景中,它们将更均匀地分布在列表中(这很好。)

    由于加载因子是基于地图的整体大小而不是列表的大小,因此哈希码的质量不会真正与加载因子交互。在第一种情况下,它会像在第二种情况下一样增长,但无论如何,所有内容都将最终出现在同一个列表中。

    【讨论】:

    • 如果哈希码负责分发,那么当负载因子出现时以及它如何影响分布接近 0 或 1
    • 正如我已经解释过的,如果所有对象都具有相同的哈希码,则负载因子无关紧要。地图上的查找退化为在未排序列表中的搜索性能。
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2019-09-10
    • 1970-01-01
    相关资源
    最近更新 更多