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的容量与性能相关推荐

  1. hashmap删除指定key_「集合系列」- 深入浅出分析HashMap

    最近几天,一直在学习HashMap的底层实现,发现关于HashMap实现的博客文章还是很多的,对比了一些,都没有一个很全面的文章来做总结,本篇文章也断断续续结合源码写了一下,如果有理解不当之处,欢迎指 ...

  2. Java之HashMap系列--HashMap扩容的原理

    原文网址:Java之HashMap系列--HashMap扩容的原理_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java的HashMap是如何扩容的. 重要大小 类 初始容量 最大容量 扩容 ...

  3. 实战系列-HashMap深入剖析

    导语   手撕面试官,面试某公司开发的时候被问到了HashMap底层,问到我怀疑人生,不知道是面试官错了还是我错了.我相信是我错了利用下班时间来分析手撕一下HashMap.   通过手撕源码加上实验来 ...

  4. Java面试系列--HashMap

    最近看到Java相关的面试时,看到一篇关于HashMap的相关面试知识点,感觉蛮好的!现在的面试点不会围绕某个知识让面试者去详细阐述,而会通过一些系列的相关问题去让你阐述,进而形成从点到线,再由线到面 ...

  5. hashmap底层原理_Java集合 - HashMap原理(一) 概念和底层架构

    HashMap在Java开发中使用的非常频繁,可以说仅次于String,可以和ArrayList并驾齐驱,准备用几个章节来梳理一下HashMap.我们还是从定义一个HashMap开始. HashMap ...

  6. java treemap 内存_Java中Map、HashMap、LinkedHashMap、TreeMap的区别

    Map: Map是一个接口不能实例化,Map接口主要有两个实现类:HashMap和TreeMap类.其中,HashMap类按哈希算法来存取对象,而TreeMap类可以对键对象进行排序: Map提供了一 ...

  7. java异或_JAVA面试必备之HashMap必会点

    今天我们就面试会问到关于HashMap的问题进行一个汇总,以及对这些问题进行解答. 1.HashMap的数据结构是什么? 2.为啥是线程不安全的? 3.Hash算法是怎样实现的? 4.HashMap是 ...

  8. hashmap put方法_Java HashMap put()方法与示例

    hashmap put方法 HashMap类的put()方法 (HashMap Class put() method) put() method is available in java.util p ...

  9. Java集合系列---HashMap源码解析(超详细)

    1 HashMap 1)特性: 底层数据结构是数组+链表+红黑树运行null键和null值,,非线程安全,不保证有序,插入和读取顺序不保证一致,不保证有序,在扩容时,元素的顺序会被重新打乱 实现原理: ...

最新文章

  1. 跳出数据计算拯救人工智能之自然法则
  2. OpportunityStepValue and Bubble chart 1
  3. python填充空值_python空值_python空值填充_python空值变量 - 云+社区 - 腾讯云
  4. SQL中的left outer join,inner join,right outer join用法 (左右内连接)
  5. abp vnext2.0之核心组件模块加载系统源码解析
  6. java线程并发库之--线程同步工具CountDownLatch用法
  7. 天猫整站SSM-分页-limit(做个人学习笔记整理用)
  8. suse linux11 改ip,suse11如何修改hostname[Linux基础]
  9. oracle入库的速度能到多少_倒车入库别练复杂了,其实就这两点
  10. 也谈莫言荣获诺贝尔文学奖后我的“低调”
  11. 远程密钥登陆linux系统(putty、xshell)
  12. 因果推断笔记——自整理因果推断理论解读(七)
  13. unittest框架(惨不忍睹低配版)
  14. MySQL配置文件详解
  15. SpringSecurity 密码加密
  16. H3C MSR 2600-10 Winet 交换机consol口设置
  17. centos7dos命令下打开网络
  18. docker compose容器域名配置
  19. 外发光材质Shader
  20. 老师的经典口头禅,这一句最扎心

热门文章

  1. SAP HANA:开启企业管理软件下一波革新浪潮?
  2. 服务体系总出bug,咸鱼社交挤压,转转的综合性二手电商还好做吗?
  3. java serializable用法_JAVA序列化Serializable及Externalizable区别详解
  4. 微波炉定时c语言程序,微波炉控制系统c语言编程.doc
  5. ssm访问html页面,SSM实现未登录无法访问页面
  6. oracle 整个表空间迁移,ORACLE表批量迁移表空间
  7. Python基础教程:列表解析
  8. Python教程:Sys 与 Import 模块
  9. Python高阶函数和函数嵌套
  10. python调用shell命令之三慷慨法