为什么Map有loadFactor而List没有呢?

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

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

Map具有负载因子,因为负载因子决定了它们的性能。 当您降低负载系数时,您可以获得更好的性能(但是您需要增加内存使用量)。

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

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

Map没有loadFactor – 只有基于某种HashMap实现才有它(例如, TreeMap上没有loadFactor)。

这是为什么?

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

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

  • HashMapcapacity并没有说明它可以存储多少元素,而是存储桶的数量。 理论上,您可以在HashMap存储多个capacity条目。
  • 在同一个桶中结束的太多项目对HashMap的性能不利。 如果您拥有的条目数量少于条目数,则会增加此类碰撞的数量。 输入loadFactor:如果事情变得“太紧”并且你担心你会遇到太多的冲突,你就会开始增加桶的数量 – 即使还剩下一些空的。