我应该为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,其中提供了有关我的方案的更准确信息。
答案 0 :(得分:2)
如果它真的值得担心这一点(我怀疑它不是 - 调整一组1000个整数不会花费很长时间),请记住HashSet
是由HashMap
支持的put
和addEntry(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加载因子。