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

时间:2015-11-05 09:17:40

标签: java collections

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

我想知道为什么列表和地图有不同的机制来决定何时增加其初始容量?

2 个答案:

答案 0 :(得分:4)

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

HashMap为例。容量是后备阵列的大小。但是,阵列的每个位置可能包含多个条目。负载系数控制平均值中存储的条目数量。

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

答案 1 :(得分:2)

Map因此没有loadFactor - 仅基于某种HashMap的实现确实拥有它(例如{{1}上没有loadFactor })。

为什么?

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

HashMapHashMap在某些重要方面有所不同:

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