hashmap应用场景_Java初学者进阶系列:HashMap的容量与性能
1. HashMap的容量与性能
HashMap的性能受到两个参数的影响:初始化容量和负载因子,下面来详细讲述这几个关键问题。
1.1 Initial Capacity与Load Factor
- Initial Capacity:初始化容量,它表示HashMap底层的那个数组,也就是Entry数组有多长,这个值默认是16。
- Load Factor:负载因子,它表示HashMap的负载程度,换句话说,它表示HashMap到底有多满了,是不是需要扩容了,这个值默认是0.75f。
初始化容量和负载因子的默认值是Java官方经过实践和优化得到的数据,可以适应大多数的场景。
当然也可以不使用其默认值,可以在构造的时候,自定义HashMap的容量和负载因子:
//单纯指定容量
Map<String,String> hashMapWithCapacity=new HashMap<>(64);
//自定义容量和负载因子
Map<String,String> hashMapWithCapacityAndLF=new HashMap<>(64, 0.9f);
一旦需要自定义容量和负载因子,我们需要搞清楚,他们到底是什么,用来干嘛,会对性能造成什么影响。
一句话:这两个数值会影响到HashMap的扩容,而扩容是一个对性能影响非常大的操作。
1.2 HashMap的扩容
1.2.1 扩容是什么
HashMap的扩容:HashMap被初始化之后,其容量是有限的(可以是默认,也可以是自定义的),当元素不断被插入,是HashMap达到一定的程度(负载因子决定),这个时候,HashMap就会扩容。
根据源码,使用公式表示,是否扩容由容量和负载因子的乘积决定!!!!
触发扩容的条件:
HashMap.Size >= Capacity * LoadFactor
- HashMap.Size:当前HashMap的实际元素个数
- Capacity:容量
- LoadFactor:负载因子
如果在默认值的条件下:
HashMap.Size = 16 * 0.75 = 12
也就是,默认的情况下,插入十二个元素的时候,就会触发扩容。
1.2.2 扩容的步骤
一旦HashMap的size超过了Capacity * LoadFactor乘积,就会触发扩容,那如何扩容呢?,需要经过两步:
- resize:即:创建一个new Entry数组,长度是原来old Entry的2倍。
- rehash:遍历old Entry数组,把里面的每一个元素取出来重新计算hash和index。为什么要重新计算呢?想一想之前的index计算公式:
index = hash值 & (length - 1)
对,因为长度已经改了,所以index肯定会不一样,举个例子:
- 当原数组长度为16时,Hash运算是和1111做与运算;
- 新数组长度为32,Hash运算是和11111做与运算。
Hash结果显然不同。
1.3 容量与性能(常见问题)
综上所述,不同的容量和负载因子的设置,会导致hashmap的扩容频率不一致。所以:
- Initial Capacity设置得低,存储空间少,但是增加了rehash的频率。所以如果能够预期到会存储比较多的数据,那么这个值应该设置高一点
- Initial Capacity设置得高,存储空间多,rehash频率少。但是会增加迭代的成本。
所以总结一个场景
- Initial Capacity设置高:大量存储,少量迭代
- Initial Capacity设置低:数据少,迭代频繁
常见问题:
- 如何扩容的
- 初始化容量是多少,如何设置,有什么应用场景
- 负载因子的作用是什么
欢迎大家一起交流!
hashmap应用场景_Java初学者进阶系列:HashMap的容量与性能相关推荐
- hashmap删除指定key_「集合系列」- 深入浅出分析HashMap
最近几天,一直在学习HashMap的底层实现,发现关于HashMap实现的博客文章还是很多的,对比了一些,都没有一个很全面的文章来做总结,本篇文章也断断续续结合源码写了一下,如果有理解不当之处,欢迎指 ...
- Java之HashMap系列--HashMap扩容的原理
原文网址:Java之HashMap系列--HashMap扩容的原理_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java的HashMap是如何扩容的. 重要大小 类 初始容量 最大容量 扩容 ...
- 实战系列-HashMap深入剖析
导语 手撕面试官,面试某公司开发的时候被问到了HashMap底层,问到我怀疑人生,不知道是面试官错了还是我错了.我相信是我错了利用下班时间来分析手撕一下HashMap. 通过手撕源码加上实验来 ...
- Java面试系列--HashMap
最近看到Java相关的面试时,看到一篇关于HashMap的相关面试知识点,感觉蛮好的!现在的面试点不会围绕某个知识让面试者去详细阐述,而会通过一些系列的相关问题去让你阐述,进而形成从点到线,再由线到面 ...
- hashmap底层原理_Java集合 - HashMap原理(一) 概念和底层架构
HashMap在Java开发中使用的非常频繁,可以说仅次于String,可以和ArrayList并驾齐驱,准备用几个章节来梳理一下HashMap.我们还是从定义一个HashMap开始. HashMap ...
- java treemap 内存_Java中Map、HashMap、LinkedHashMap、TreeMap的区别
Map: Map是一个接口不能实例化,Map接口主要有两个实现类:HashMap和TreeMap类.其中,HashMap类按哈希算法来存取对象,而TreeMap类可以对键对象进行排序: Map提供了一 ...
- java异或_JAVA面试必备之HashMap必会点
今天我们就面试会问到关于HashMap的问题进行一个汇总,以及对这些问题进行解答. 1.HashMap的数据结构是什么? 2.为啥是线程不安全的? 3.Hash算法是怎样实现的? 4.HashMap是 ...
- hashmap put方法_Java HashMap put()方法与示例
hashmap put方法 HashMap类的put()方法 (HashMap Class put() method) put() method is available in java.util p ...
- Java集合系列---HashMap源码解析(超详细)
1 HashMap 1)特性: 底层数据结构是数组+链表+红黑树运行null键和null值,,非线程安全,不保证有序,插入和读取顺序不保证一致,不保证有序,在扩容时,元素的顺序会被重新打乱 实现原理: ...
最新文章
- 跳出数据计算拯救人工智能之自然法则
- OpportunityStepValue and Bubble chart 1
- python填充空值_python空值_python空值填充_python空值变量 - 云+社区 - 腾讯云
- SQL中的left outer join,inner join,right outer join用法 (左右内连接)
- abp vnext2.0之核心组件模块加载系统源码解析
- java线程并发库之--线程同步工具CountDownLatch用法
- 天猫整站SSM-分页-limit(做个人学习笔记整理用)
- suse linux11 改ip,suse11如何修改hostname[Linux基础]
- oracle入库的速度能到多少_倒车入库别练复杂了,其实就这两点
- 也谈莫言荣获诺贝尔文学奖后我的“低调”
- 远程密钥登陆linux系统(putty、xshell)
- 因果推断笔记——自整理因果推断理论解读(七)
- unittest框架(惨不忍睹低配版)
- MySQL配置文件详解
- SpringSecurity 密码加密
- H3C MSR 2600-10 Winet 交换机consol口设置
- centos7dos命令下打开网络
- docker compose容器域名配置
- 外发光材质Shader
- 老师的经典口头禅,这一句最扎心
热门文章
- SAP HANA:开启企业管理软件下一波革新浪潮?
- 服务体系总出bug,咸鱼社交挤压,转转的综合性二手电商还好做吗?
- java serializable用法_JAVA序列化Serializable及Externalizable区别详解
- 微波炉定时c语言程序,微波炉控制系统c语言编程.doc
- ssm访问html页面,SSM实现未登录无法访问页面
- oracle 整个表空间迁移,ORACLE表批量迁移表空间
- Python基础教程:列表解析
- Python教程:Sys 与 Import 模块
- Python高阶函数和函数嵌套
- python调用shell命令之三慷慨法