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

Cla*_*key 16 java set

好的,这是我的情况:

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

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

从谷歌搜索,我想出了:

String[] allStates = getAllStates();
Set<String> uniqueStates = new HashSet<String>(allStates.length, 0.75);
Run Code Online (Sandbox Code Playgroud)

这个问题是allStates可以包含1到5000个状态.因此,Set的容量将超过5000,但最多只能容纳50个.

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

我想我的问题确实是:

  • 当您不知道Set中有多少项时,您应该将初始容量设置为什么?
  • 当它可以包含的最多是50时,它真正重要的是什么?
  • 我应该担心吗?

Zar*_*nen 15

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

Set<String> uniqueStates = new HashSet<String>(allStates.length, 0.75);
Run Code Online (Sandbox Code Playgroud)

引用肯定是错的.我建议你的初始容量为50/0.75 = 67,或者可能是68以保证安全.

我也觉得有必要指出你可能会过度强调这一点.将arraylist从16提升到64再调整为64,除非在程序中性能最关键的部分正确,否则不会给你带来明显的性能提升.

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

new HashSet<String>();
Run Code Online (Sandbox Code Playgroud)

这样,一年之后你就不会回来了,并且为什么选择这样奇怪的构造函数参数而困惑.

  • +1为"一年后回来和拼图".总是发生在未记录的代码中 (4认同)

sta*_*lue 7

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

  • 好吧,明智地避免性能问题,但不要微观优化. (2认同)