Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哈希集的初始容量<;整数>;_Java_Data Structures_Hashmap_Hashset - Fatal编程技术网

Java 哈希集的初始容量<;整数>;

Java 哈希集的初始容量<;整数>;,java,data-structures,hashmap,hashset,Java,Data Structures,Hashmap,Hashset,如果我知道要在其中插入1000个整数以避免任何内部重建,那么我应该为哈希集使用什么初始容量 起初我认为我应该使用1000,但是阅读构造函数的描述,它使用initialCapacity参数,它说构造了一个新的空集;备份HashMap实例具有指定的初始容量和默认负载因子(0.75)。 那么,如果我将容量设置为1000,当达到750个元素时,hashMap将调整大小 我还假设hashMap的有效性需要一些“空间”,所以解决IC*0.75=1000以获得类似1334的结果可能不是最好的解决方案,或者是吗

如果我知道要在其中插入1000个整数以避免任何内部重建,那么我应该为哈希集使用什么初始容量

起初我认为我应该使用1000,但是阅读构造函数的描述,它使用initialCapacity参数,它说
构造了一个新的空集;备份HashMap实例具有指定的初始容量和默认负载因子(0.75)。

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

我还假设hashMap的有效性需要一些“空间”,所以解决IC*0.75=1000以获得类似1334的结果可能不是最好的解决方案,或者是吗

更新:
1) 我知道内部尺寸调整的含义并不重要,但它仍然是一个学习和更好地理解我使用的环境的机会。而这种努力应该是最小的

2) 关于数据结构选择的几点意见。请看一看我之前的问题:这里提供了关于我的场景的更准确的信息。

如果真的值得担心的话(我怀疑没有-调整1000个整数的大小不会花费太长时间),然后请记住,
HashSet
HashMap
支持,并且
put
方法引用:

addEntry(整数散列,K键,V值,整数bucketIndex){
条目e=表[bucketIndex];
表[bucketIndex]=新条目(散列、键、值、e);
如果(大小+>=阈值)
调整大小(2*表格长度);
}
对于这样的查询,它总是值得一试,尽管要记住实现可能总是会发生变化(即使是小的JRE版本)


最后,集合是否适合此场景?如果整数分配的大小是固定的,那么一个简单的数组(使用原语,从而避免装箱)可能会更快/更简单?

您需要一个
大小/加载因子来避免调整大小。注意:对于HashSet和HashMap,它总是2的下一次幂。

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


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

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


选择/0.75负载系数

你要插入1000多个整数吗?那么为什么不使用这个构造函数呢
HashSet(int initialCapacity,float loadFactor)
这些纳秒对您来说一定非常重要。@KevinBowersox我将插入1000个整数。如果您知道您将使用1000个整数,并且非常努力地避免重建,更具体的数据结构是否合适?了解否决正确答案的原因总是很有趣的。选民们,花点时间解释一下你们的理由!对我会支持的!谢谢你对grepCode的引用-我不知道。我也同意反对票。但是我没有理解你展示这段特定代码的意思。关于数据结构的选择,请看一下我之前的问题:因为它更好地解释了整个场景。这难道不能保证至少在重建时100%确定吗?如果您必须设置
负载系数
初始容量
,我相信这是最好的答案。将容量设置为您所需的容量,并将负载系数设置为需要全套。由于设置的大小是固定的,因此不应重新加载。整数本身怎么可能是散列键?假设它们来自0-999999的范围?hashMap只有1000个存储桶。。。我是不是遗漏了什么?二的幂是多少?比例还是尺寸?(显然不是荷载因素)。另外,我猜你答案中的HashMap应该是HashSet…@epeleg桶数的容量总是2的幂。这是为了在查找哈希的正确存储桶时用位掩码替换模数。
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);
}