Java 当我知道元素的最终数量时,Hashmap的创建性能
如果我知道HashMap中元素的最终大小,那么从性能角度来看,构建它的最佳方法是什么?基于JavaDoc,为了避免重新灰化,可以执行以下操作: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
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。