HashSet的初始容量<integer> </integer>

时间:2013-08-19 08:01:09

标签: java data-structures hashmap hashset

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:2)

如果它真的值得担心这一点(我怀疑它不是 - 调整一组1000个整数不会花费很长时间),请记住HashSet是由HashMap支持的putaddEntry(int hash, K key, V value, int bucketIndex) { Entry<K,V> e = table[bucketIndex]; table[bucketIndex] = new Entry<K,V>(hash, key, value, e); if (size++ >= threshold) resize(2 * table.length); } 方法引用this

{{1}}

对于此类查询,总是值得checking out the source cod e,但请记住,实现可能始终会发生变化(即使次要 JRE版本)。

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

答案 1 :(得分:2)

您需要size/load-factor才能避免调整大小。注意:它总是HashSet&amp;的下一个2的幂。 HashMap中。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

去&lt;#of integers&gt; /0.75加载因子。