负载因子 ( loadFactor)
负载因子是扩充 table 的指标量, 默认 0.75, 当 Map中键值对数量 / bins总量 > loadFactor 时, 扩容 table 到原来容量的两倍.
负载因子的意义: 负载因子是在碰撞概率和空间利用率之间进行权衡的调节器. 从直观上感觉, 负载因子描述了 table 的稀疏程度.
- 负载因子越小, 出现 hash 碰撞的概率越低, bin 中的链表越短; 同时空间利用率低 (空 bin 多, 浪费). Table 看上去非常稀疏.
- 负载因子越大, 出现 hash 碰撞的概率越高, bin 中的链表越长; 同时空间利率也高 (空 bin 少, 不浪费). Table 看上去非常稠密.
看图从直观上感觉 table 的稀疏程度:
左侧 table 加载因子 = 0.1, 右侧 table 加载因子 = 0.6. 不过实际上 bins 的分布不会这么均匀.
例如:
-
场景一: table 长度 = 10, 负载因子 = 0.1, 每加入一个元素就会扩容, 浪费了空间, 但一定不会出现碰撞.
-
场景二: 如果将场景一中的负载因子修改为1, 则加入 10 个元素后才会触发扩容, 可想而知因为这 10 个元素是通过 hash % size 落入 table 中的, 最理想的状态是每个 bulk 中落入一个元素, 但几乎可以肯定的是, 有的 bulk 中落入了两个或更多元素 (形成链表), 即出现了碰撞.
默认值为什么是 0.75?