选择具有预期数量的唯一值和插入的哈希集的初始容量

2022-09-02 20:51:30

好的,这是我的情况:

我有一个状态数组,其中可能包含重复项。为了摆脱重复项,我可以将它们全部添加到集合中。

但是,当我创建 Set 时,它希望定义初始容量和负载因子,但应将它们设置为什么?

通过谷歌搜索,我想出了:

String[] allStates = getAllStates();
Set<String> uniqueStates = new HashSet<String>(allStates.length, 0.75);

这样做的问题是,allStates可以包含1到5000个州之间的状态。因此,该套装的容量将超过5000,但最多只能包含50。

因此,也可以将 Set 的最大大小设置为最大状态数,并将负载因子设置为 1。

我想我的问题真的是:

  • 当您不知道集合中有多少个项目时,应将初始容量设置为什么?
  • 当它所能包含的最大值为50时,它被设置为什么真的重要吗?
  • 我甚至应该担心它吗?

答案 1

假设您知道不会有超过50个州(您的意思是美国各州吗?),那么

Set<String> uniqueStates = new HashSet<String>(allStates.length, 0.75);

引用绝对是错误的。我建议你选择50 / 0.75 = 67的初始容量,或者可能是68以确保安全。

我也觉得有必要指出,你可能过度思考了这一点。将数组列表的大小从 16 调整到 64 两次不会给您带来明显的性能损失,除非这正好在程序中性能最关键的部分。

所以最好的答案可能是使用:

new HashSet<String>();

这样,你就不会在一年后回来,纠结于你为什么选择如此奇怪的构造函数参数。


答案 2

使用不需要指定这些值的构造函数,然后选择合理的默认值。


推荐