当您知道HashSet中最大可能的元素数时,应使用什么负载因子

Raj*_*pta 7 java collections hashtable hashmap hashset

当我真正知道HashSet中最大可能的元素数时,我应该使用什么负载因子?我听说建议使用0.75的默认负载系数,因为它在速度和空间之间提供了良好的性能折衷.它是否正确 ?但是,更大的HashSet也会在创建和更多空间上花费更多时间.

我正在使用HashSet,以便从整数列表中删除重复的整数.

Kev*_*ion 5

我花了一些时间来研究一下载荷因子,并且令人震惊的是,这种设置在实践中确实有多么不同.即使将其设置为像2.0这样的高点也不会减慢速度,也不会节省大量内存.只是假装它不存在.Josh经常后悔曾将它作为一种选择暴露出来.

  • @Pacerier:我强烈怀疑最后一句话来自于面对面的谈话,因为凯文和乔希经常谈话. (2认同)

cor*_*iKa 0

如果您确切知道应该有多少个,则应该将负载因子设置为 1 并确保哈希函数映射为 1:1。您可能希望扩展您的容器以不重新散列您的哈希值。

请注意,这种“精确”的东西往往会随着时间的推移而改变,所以你最好只使用普通的容器。:)

编辑:我的答案是在我知道它是整数之前。

是的,你最好的选择就是保持原样离开。你永远不会注意到其中的差异。

/**
 * Remove duplicates from a list. 
 * @note This will ALTER the list. 
 * @note This is not thread safe.
 * @param the list (potentially with duplicates)
 */
void removeDuplicates(List<Integer> list) {
    Set<Integer> noDupe = new HashSet<Integer>(list.size()); // will end up resizing once, oh well
    for(Integer i : list) noDupe.add(i);
    list.clear();
    list.addAll(noDupe);
}
Run Code Online (Sandbox Code Playgroud)