Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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_Collections_Hashmap - Fatal编程技术网

Java 当我知道元素的最终数量时,Hashmap的创建性能

Java 当我知道元素的最终数量时,Hashmap的创建性能,java,collections,hashmap,Java,Collections,Hashmap,如果我知道HashMap中元素的最终大小,那么从性能角度来看,构建它的最佳方法是什么?基于JavaDoc,为了避免重新灰化,可以执行以下操作: int TOTAL_ELEMENTS_TO_BE_STORED = 10; ... = new HashMap<T, Q>( TOTAL_ELEMENTS_TO_BE_STORED + 1, 1.0f ); int TOTAL_ELEMENTS_TO_BE_storage=10; ... = 新的HashMap(存储的元素总数+1,1.0f

如果我知道HashMap中元素的最终大小,那么从性能角度来看,构建它的最佳方法是什么?基于JavaDoc,为了避免重新灰化,可以执行以下操作:

int TOTAL_ELEMENTS_TO_BE_STORED = 10;
... = new HashMap<T, Q>( TOTAL_ELEMENTS_TO_BE_STORED + 1, 1.0f );
int TOTAL_ELEMENTS_TO_BE_storage=10;
... = 新的HashMap(存储的元素总数+1,1.0f);
而且:

... = new HashMap<T, Q>( Math.ceil(TOTAL_ELEMENTS_TO_BE_STORED * 1.333) + 1 );
…=新的HashMap(Math.ceil(要存储的元素总数*1.333)+1);
我从HashMap javadoc中读到:

较高的值会减少空间开销,但会增加查找成本(反映在HashMap类的大多数操作中,包括get和put)


查找成本是否会更高?在这种情况下,通常建议使用默认的0.75负载系数,而不是提供更大的容量,还是相反?

是的,查找成本会更高

选择取决于您的需求

  • 您需要能够快速查找元素,并且您的数据足够小-保留0.75的负载系数
  • 你有大量的数据,你不想节省大量的内存-使用1.0作为负载系数

顺便说一句,负载系数不在[0.75,1]范围内-您可以选择任何正值。值越大,所需的内存越少,但查找的时间越长。

如果问题是关于性能,并且您事先知道元素的数量,那么最好选择一个具有(自写或从某个库中)的哈希表,而不是标准的
哈希映射


由于元素数量较少,简单的
ArrayList
可能比任何哈希表数据结构都要快。你需要做一些基准测试

最昂贵的是用于存储的内部阵列的调整大小阶段。此时的条目需要重新散列,并可能移动到不同的存储桶。同时,由于其他一些原因,也可能发生重新调整规模的情况;避免明显的错误是一个很好的选择

如果您知道将有多少个条目,只需将该数字加上33%,并保留默认的
load\u系数
0.75

例如,当您有16个存储桶时,在调整大小之前只能放置12个条目


此外,阵列的大小是下一个
二次幂
——即使您没有提供。所以如果你有100个条目;125是
+33%
;虽然内部大小将是
128

微基准标记:-)我们通常采用第一种方法,而且速度足够快。在我们的环境中,
Math
包中的方法有时会出现一些奇怪的性能问题。如果您的总大小是10,那么您真的不需要关心。只需使用新的HashMap()。如果这个数字很大,下面是Guava实现它的方式:默认选项是否已经变得太慢了?我认为knuth写道,早期优化是番石榴链接评论中所有问题的根源。当然,10只用于说明。你是说+33%?然后
(MAX_ELEMENTS*1.33*0.75)=MAX_ELEMENTS
@user1485864是。。。我的错;因此,当您知道将有12个元素时,需要将容量指定为16。