千万级的数据用hashmap存储需要考虑哪些问题?

答案:一般会预先初始化一个大容量的map

解释

hashmap默认初始化容量为16,在不断添加key-value时,使用率达到75%会触发扩容,此时hashmap容量会增大一倍,同时会进行key-value的拷贝及重新计算hash映射,当map中存储的key-value越来越多时扩容将导致内存溢出,所以要存储上百万或千万数据时一般会预先初始化一个大容量的map,防止扩容导致数据拷贝,除了扩容时会影响存储读取效率之外其它的原因就是散列算法的碰撞率了,碰撞的数据越多存储和读取的性能都会下降。

HashMap的扩容机制

HashMap的扩容机制是为了保证HashMap的性能和空间利用率。当HashMap中的元素数量超过了负载因子(默认为0.75)和容量的乘积时,就需要进行扩容。具体的扩容过程如下:

创建一个新的数组,长度为原数组的2倍。

将原数组中的元素重新计算哈希值,并存储到新数组对应的位置上。

如果新数组中的一个位置已经有元素了,就会发生哈希冲突,这时需要将新元素插入到这个位置的链表的末尾。

扩容完成后,原数组中的元素会被全部转移到新数组中。

在扩容的过程中,由于需要重新计算哈希值和重新存储元素,因此会消耗一定的时间和内存资源。因此,为了提高HashMap的性能,应该尽量避免频繁扩容。可以通过调整负载因子的大小、提前设置HashMap的容量等方式来减少扩容的次数,从而提高HashMap的性能。

更改扩容因子

可以使用HashMap的构造函数来更改扩容因子。HashMap有两个构造函数,分别是不带参数的构造函数和带有初始化容量和负载因子的构造函数。其中,负载因子就是用来控制HashMap何时需要扩容的因素。

默认情况下,HashMap的负载因子为0.75,也就是说当HashMap中元素的数量超过了0.75倍的容量时,就需要进行扩容。如果希望更改负载因子,可以使用带有初始化容量和负载因子的构造函数来创建HashMap对象,例如:

Map<String, Integer> map = new HashMap<>(16, 0.8f);

上述代码中,第一个参数16表示初始化容量为16,第二个参数0.8f表示负载因子为0.8。

需要注意的是,在更改负载因子之后,可能会影响HashMap的性能。如果负载因子设置得太小,就会导致HashMap频繁扩容,从而降低性能;如果负载因子设置得太大,就会导致哈希冲突增加,从而降低查询效率。因此,在更改负载因子时,需要根据实际情况进行调整,以达到最佳的性能表现。

参考转载:
链接:https://www.zhihu.com/question/60717558/answer/179787951
作者:ccloomi

作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

posted @   Chenyi_li  阅读(867)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示