Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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 如果元素的数量事先已知,是否应该定义HashMap的初始容量和负载因子?_Java_Hashmap - Fatal编程技术网

Java 如果元素的数量事先已知,是否应该定义HashMap的初始容量和负载因子?

Java 如果元素的数量事先已知,是否应该定义HashMap的初始容量和负载因子?,java,hashmap,Java,Hashmap,如果您有,并且您知道它将容纳的最大元素数(最多;因为您使用枚举作为键,HashMap countPerEnumType;,因此您知道最大可能的元素数将是EnumType.values().length),您会为该HashMap指定初始容量和负载因子吗?为什么 如果可以的话,我假设负载系数可以是1?(安全?还是有副作用?) 初始容量是length、length/loadFactor,还是(length/loadFactor)+1(即HashMap已满时,还是已满且下一个元素即将插入时,会展开 您必

如果您有,并且您知道它将容纳的最大元素数(最多;因为您使用枚举作为键,
HashMap countPerEnumType;
,因此您知道最大可能的元素数将是
EnumType.values().length
),您会为该HashMap指定初始容量和负载因子吗?为什么

如果可以的话,我假设负载系数可以是
1
?(安全?还是有副作用?)

初始容量是
length
length/loadFactor
,还是
(length/loadFactor)+1
(即HashMap已满时,还是已满且下一个元素即将插入时,会展开

您必须如何设置哈希映射以防止为空存储桶调整大小和浪费内存

编辑:该示例使用enum和EnumMap(在我重新表述问题之前)-但假设键不是enum,但您仍然知道将提前结束的元素数?

使用an,它是专为enum键设计的高性能
映射:

Map<EnumType, Integer> counts = new EnumMap<>();
Map counts=new EnumMap();
请改用,这是一种专为枚举键设计的高性能
映射

Map<EnumType, Integer> counts = new EnumMap<>();
Map counts=new EnumMap();

我的理解是,如果put操作会导致映射的大小超过初始容量乘以负载系数,则HashMap将在put操作期间调整大小


如果您声明HashMap的初始容量等于您希望插入的元素数,并且负载因子为1,则所有存储桶都将被填充,并且不会浪费任何存储桶。

我的理解是,如果put操作会导致映射的大小超过初始容量mul,则HashMap将在put操作期间调整大小受荷载系数影响



如果声明HashMap的初始容量等于要插入的元素数,负载系数为1,则将填充所有存储桶,并且不会浪费任何存储桶。

将填充所有存储桶,否,仍然可能存在哈希冲突。因为枚举默认使用对象的
哈希代码。如果条目数相当慢,则与任何类型(枚举或其他类型)发生冲突的几率都非常低,如果发生冲突,则不会造成真正的伤害。“所有存储桶都将被填满”,不,仍然可能存在哈希冲突。因为枚举默认使用
对象
哈希代码
。如果条目数相当慢,则与任何类型(枚举或其他类型)发生冲突的几率都非常低,如果发生冲突,则不会造成真正的危害。枚举值是键吗?是的。对不起,我想
已经发生了hMap
使其隐式…;-)然后使用
枚举映射
。如果键不是枚举,但您事先知道所有键,请编写一个自定义哈希函数,为每个键返回一个范围
[0..n-1]
内的不同值(其中
n
是键数)。然后使用标准的
HashMap
。看,我刚刚发现了一个最有趣的问题:那里的用户不一定能想出一个解释,但是有很多重要的数据表明,每个人关于初始容量和负载系数的说法都是正确的:“很难,不要碰。”;-)需要注意的一点是,容量在使用之前会进行重新设计:枚举值是键吗?是的。很抱歉我想
HashMap
让它隐式…;-)然后使用
EnumMap
。如果键不是枚举,但您事先知道所有键,请编写一个自定义哈希函数,为每个键返回一个范围
[0..n-1]
内的不同值(其中
n
是键数)。然后使用标准的
HashMap
。看,我刚刚发现了一个最有趣的问题:那里的用户不一定能想出一个解释,但是有很多重要的数据表明,每个人关于初始容量和负载系数的说法都是正确的:“很难,不要碰。”;-)需要注意的一点是,容量在使用前会进行重新设计,无论如何:很好的发现,即使它不完全符合问题-它确实有助于解决手头的特定问题…)它怎么不适合这个问题呢?如果预先知道元素的数量,是否应该定义HashMap的初始容量和负载因子?没有提及枚举。:)@Christian该答案为所提出的问题提供了正确的解决方案,即使该问题的措辞是问其他问题。通常,“如何做到这一点”的最佳答案是“不要那样做”。一个包含少量元素的
HashMap
,其数量(大致)提前知道,只需使用元素数量的三分之四和默认负载因子的容量进行初始化即可。如果元素的数量足够小(比如少于几百个),并且映射被填充一次或很少,那么只需使用无参数构造函数;这对内存或性能的影响即使可以测量,也可以忽略不计。算了吧。“过早优化是万恶之源”-KnuthNice博士发现,即使它不完全符合问题-它确实有助于解决手头的特定问题…:)它怎么不适合这个问题呢?如果预先知道元素的数量,是否应该定义HashMap的初始容量和负载因子?没有提及枚举。:)@Christian该答案为所提出的问题提供了正确的解决方案,即使该问题的措辞是问其他问题。通常,“如何做到这一点”的最佳答案是“不要那样做”。一个包含少量元素的
HashMap
,其数量(大致)提前知道,只需使用元素数量的三分之四和