HashSet 的初始容量

我应该为HashSet使用什么初始容量,我知道我将插入1000个整数以防止需要进行任何内部重建?

起初我虽然我应该使用1000但是阅读Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and default load factor (0.75). initialCapacity参数的构造函数的描述,它表示Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and default load factor (0.75). Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and default load factor (0.75).

那么如果我将容量设置为1000,hashMap会在达到750个元素时resize?

另外我假设hashMap的有效性需要一些“空间”,因此解决IC * 0.75 = 1000来获得像1334这样的东西可能也不是最好的解决方案或者是它?

更新:
1)我知道内部重新规模的含义并不重要,但仍然是学习和更好地理解我所使用的环境的机会。 努力应该是最小的。

2)关于数据结构选择的几点评论。 请在此处查看我之前的Q: 数据结构建议 ,其中提供了有关我的方案的更准确信息。

您需要一个size/load-factor来避免resize。 注意:对于HashSet和HashMap,它始终是2的下一个幂。

对于您的情况,将初始容量设置为1000并将加载因子设置为1是合理的,因为两个不同的 Integer将不共享相同的哈希(这是int本身)。

然而,出于一般目的,您不应该真正关心负载因子并保持原样,因为您可能永远不会注意到自己设置的任何改进。 增加负载系数实际上可能导致性能急剧下降。

如果它真的值得担心这个(我怀疑它不是 – 调整一组1000个整数不会花费很长时间),那么请记住HashSetHashMap支持, put方法引用它 :

 addEntry(int hash, K key, V value, int bucketIndex) { Entry e = table[bucketIndex]; table[bucketIndex] = new Entry(hash, key, value, e); if (size++ >= threshold) resize(2 * table.length); } 

总是值得检查这些查询的源代码 e,但请记住,实现可能总是会改变(即使是次要的 JRE版本)。

最后,是一个适合这种情况的集合吗? 如果你有一个固定大小的整数分配,也许一个简单的数组(使用原语,从而避免装箱)会更快/更简单?

我认为,理想的初始容量是将其保持为要插入的整数数,并将负载因子保留为默认值。

转到<整数> /0.75加载因子。