首页 > 其他分享 >千万级的数据用hashmap存储需要考虑哪些问题?

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

时间:2023-05-24 16:57:09浏览次数:73  
标签:扩容 存储 hashmap 负载 千万级 因子 构造函数 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

标签:扩容,存储,hashmap,负载,千万级,因子,构造函数,HashMap
From: https://www.cnblogs.com/chenyi502/p/17428851.html

相关文章

  • 学习:存储加密和传输加密的审计要点
    学习转载:存储加密和传输加密的审计要点存储加密和传输加密的审计要点近年来,随着移动互联网的高速发展,在人们享受网络带来便利的同时,信息安全也逐渐成为大众关注的热点。2021年落地的《中华人民共和国个人信息保护法》中第五十一条中明确提到,对于个人信息处理者的义务:采取相应......
  • 变量的存储 -- 栈和堆的区别
    引用:彻底搞懂JS闭包各种坑-简书(jianshu.com)1.js中基本变量和对象的内存存储:      2. ......
  • Elasticsearch与Clickhouse数据存储对比
    1背景京喜达技术部在社区团购场景下采用JDQ+Flink+Elasticsearch架构来打造实时数据报表。随着业务的发展Elasticsearch开始暴露出一些弊端,不适合大批量的数据查询,高频次分页导出导致宕机、存储成本较高。Elasticsearch的查询语句维护成本较高、在聚合计算场景下出现数据不精确......
  • Oracle 存储过程多数据集返回-程序处理
    oracle存储过程返回数据集是以游标参数的形式返回,同时返回多个数据集就相当于多几个输出类型的游标参数,而在程序处理中如何处理这种多结果集的存储过程?今天研究了Delphi7和c#两种语言,D7ODBC方式连接,OraStoreProced对象无法处理多个对象,查看其父类TCustomOraQuery,不想c#......
  • linux nfs共享存储服务
    目录一、nfs服务二、nfs优点三、配置文件四、共享文件配置过程五、实验1.创建共享文件(两台终端共享)              一、nfs服务概念:网络上共享文件系统的协议,运行多个服务器之间通过网络共享文件和目录服务端:将指定目录标记......
  • 万字长文之HashMap源码解析(包含红黑树)
    〇、储备知识之红黑树0.1>2-3树红黑树是一种自平衡的二叉树,它可以避免二分搜索树在极端的情况下蜕化成链表的情况。那么什么是红黑树呢?要想便于了解红黑树,我们先了解一下跟它息息相关的2-3树。2-3树是一种绝对平衡的多叉树,在这棵树中,任意一个节点,它的左右子树的高度是相同的。如下......
  • 为什么 HashMap 会死循环?
    HashMap死循环发生在JDK1.8之前的版本中,它是指在并发环境下,因为多个线程同时进行put操作,导致链表形成环形数据结构,一旦形成环形数据结构,在get(key)的时候就会产生死循环。如下图所示:死循环原因HashMap导致死循环的原因是由以下条件共同导致的:HashMap使用头插法进......
  • Mac下存储环境变量相关文件
    配置bash首先,说明下MacOS系统的环境变量主要由下面几个文件和文件夹所决定,并且他们的加载顺序如下:/etc/profile/etc/paths/etc/bashrc~/.bash_profile 或 ~/.bashrc ~/.bash_login其中,/etc/profile, /etc/paths, /etc/bashrc 是系统级别配置文件,系统启动就会加载......
  • SharedPreferences存储数据
    适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口令密码等  核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。通过DDMS的F......
  • ConcurrentHashMap 相关
    为什么ConcurrentHashMap要放弃分段锁?答:1、因为在JDK7中 Segment 继承了重入锁ReentrantLock。在每个 Segment 在增长的时候,这时候锁的粒度也会在不断的增长。每个锁控制的是一段,当分段很多,并且加锁的分段不连续的时候,内存空间的浪费比较严重。在并发操作中,因为分段锁的......