哈希集<Integer>的初始容量



我知道要向其中插入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) 对数据结构的选择提出了几点意见。请看一下我之前的问题:数据结构建议,其中提供了关于我的场景的更准确的信息。

您需要一个size/load-factor来避免调整大小。注意:对于HashSet&HashMap。

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

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

如果真的值得担心(我怀疑这不是-调整一组1000个整数的大小不会花很长时间),那么请记住HashSetHashMap支持,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版本)。

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

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

选择<#整数>/0.75负载系数。

最新更新