我有一个存储数百万条的HashMap。现在为了避免在每次达到阈值时重新进行重新散列,我想给出用户定义的初始容量和负载因子值,以便重新散列是最小的。在这种情况下,初始容量和负载系数的值应该是什么?
答案 0 :(得分:2)
一般情况下,如果您知道地图中的最大条目数n
,为了避免调整大小,您可以将capacity
设置为n / loadFactor
。您将负载系数设置为某个值,该值反映了您在空间/时间权衡空间中的特定需求。如果您不确定哪种加载因子最佳,则0.75
的默认值可能是一个很好的起点。
关键点是,capacity
不 哈希映射在调整大小之前将接受的元素数量,而是基础的大小阵列。哈希映射在调整大小之前将接受loadFactor * capacity
个元素。因此,您需要在计算容量时加入loadFactor
。
具体而言,如果您使用loadFactor
的默认0.75
并且您知道地图将包含1,000,000个元素,则必须将容量设置为1e6 / 0.75 = ~1,333,334
元素以避免调整大小。如果您不确定完全大小,那么包含缓冲区可能是有意义的,这样您就可以合理地避免调整大小。
可以说一个更好的API就是直接将capacity
参数定义为在调整大小之前可以添加到集合中的元素数量,然后构造函数执行任何计算必须正确设置其内部阈值成员。这与其他结构的“容量”含义一致,例如ArrayList
。