【问题标题】:Why does Map has loadFactor and List does not have it?为什么 Map 有 loadFactor 而 List 没有?
【发布时间】:2016-02-06 01:16:21
【问题描述】:

在 Java 中创建 Map 或 List 时,它们都具有相同的默认初始容量 10。它们的容量随着获得新元素而增长。但是,List 仅在添加第 11 个元素时才会增长,而 Map 在添加第 8 个元素时已经增长。发生这种情况是因为 Map 有一个 loadFactor 字段,该字段调节它的“饱和”程度。当饱和度高于 loadFactor 时,Map 会增长。 loadFactor 默认为 0.75。

我想知道为什么 Lists 和 Maps 有不同的机制来决定何时增加它们的初始容量?

【问题讨论】:

  • 虽然没多大关系,只是为了澄清,HashMap的默认初始容量不是10,而是16,应该是2的幂

标签: java collections


【解决方案1】:

Maps 有负载因子,因为负载因子决定了它们的性能。当您降低负载因子时,您会获得更好的性能(但您会因内存使用量的增加而付出代价)。

HashMap 为例。容量是后备数组的大小。但是,数组的每个位置都可能包含多个条目。负载因子控制在单个数组位置中平均存储多少条目。

另一方面,在ArrayList 中,后备数组的每个索引都包含一个元素,因此负载因子没有任何意义。

【讨论】:

  • 当然TreeMap 没有负载率/容量,LinkedList 没有容量,总是按需增长。
  • 添加更重要的一点。负载因子是哈希表在其容量自动增加之前允许达到的程度的度量。当哈希表中的条目数超过负载因子和当前容量的乘积时,重新哈希表。
【解决方案2】:

Maps 本身没有 loadFactor - 只有基于某种 HashMap 的实现才有它(例如,TreeMap 上没有 loadFactor)。

这是为什么呢?

HashMap 包含许多“桶”,当添加或检索条目时,您获取密钥的哈希码并计算您必须将其放入或从哪个桶中检索。基于散列实现的质量,两个不同的对象可能最终在同一个桶中。发生这种情况时,hashmap 会启动一个链接列表,您在检索条目时必须通过该链接列表。

HashMapList 在一些重要方面有所不同:

  • HashMapcapacity 并没有说其中可以存储多少元素,它是桶的数量。理论上,您可以在 HashMap 中存储多个 capacity 条目。
  • 太多的项目最终在同一个存储桶中不利于HashMap 的性能。如果您拥有的存储桶相对于条目数量而言较少,您将增加此类冲突的数量。输入 loadFactor:如果事情变得“太紧”并且您担心会发生太多碰撞,您就会开始增加存储桶的数量 - 即使还有一些空的存储桶。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2019-05-23
    • 2014-07-01
    • 2010-11-09
    • 2015-10-08
    • 1970-01-01
    相关资源
    最近更新 更多