为什么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会启动一个链接列表,您在检索条目时必须完成该列表。
HashMap
和List
在一些重要方面有所不同:
-
HashMap
的capacity
并没有说明它可以存储多少元素,而是存储桶的数量。 理论上,您可以在HashMap
存储多个capacity
条目。 - 在同一个桶中结束的太多项目对
HashMap
的性能不利。 如果您拥有的条目数量少于条目数,则会增加此类碰撞的数量。 输入loadFactor:如果事情变得“太紧”并且你担心你会遇到太多的冲突,你就会开始增加桶的数量 – 即使还剩下一些空的。