5

我应该为 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) 对数据结构的选择提出了几点意见。请在此处查看我之前的 Q:数据结构推荐,其中提供了有关我的场景的更准确信息。

4

4 回答 4

3

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

于 2013-08-19T08:06:56.883 回答
2

如果真的值得担心这一点(我怀疑它不是 - 调整一组 1000 个整数的大小不会花费很长时间),那么请记住,HashSet它由 a 支持,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);
}

检查此类查询的源代码总是值得的,但请记住,实现可能总是会发生变化(即使对于较小的JRE 版本)。

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

于 2013-08-19T08:05:06.970 回答
2

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

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

于 2013-08-19T08:07:19.090 回答
0

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

选择 <# of integers>/0.75 负载因子。

于 2013-08-19T08:07:36.203 回答