当前位置: 首页 > news >正文

HashMap的put过程以及hashMap的简单介绍

学习HashMap需要先知道HashMap的一些基本知识点,首先HashMap的数据结构:数组+链表+红黑树(JDK1.8之后)HashMap的存取是无序的在一个数组中通过Hash算法把数据存入,HashMap的键和值都是可以为NULL的但是键位置只能是一个NULLHashMap是有阈值的也就是说当数组长度大于64,并且值大于8时,就会变成将链表变成红黑树当红黑树节点 ≤6 时退化为链表。才会将链表转换成红黑树,目的是为了更加高效的查询。

当我们创建HashMap对象的时候,在JDK8之前,就是在构造方法当中创建一个长度为16的Entry[] Table用来存储键值对数据,JDK8以后就不是在HashMap构造方法创建数组了,是在第一次put方法的时候穿件数组,同时创建的是Node[] table,底层实现上还是Entry数组。

当我们使用HashMap的put的时候,可能会出现下面的操作。

当我们哈希碰撞的时候,就会比较内容,底层就会调用key值锁属于类型的equals方法来进行比较它们的value值是否相等,如果想等那么就会取代value1成为value2,假如说不相同,那么就会继续在这个链表上面进行比较,如果都不相同就会出现一个新的节点来进行存储。

注意!

我们来看一下put的时候会经历什么

首先开始的时候先判断是否创建的有Map假如说没有的话就会进行扩容,扩容到原来的二倍,初始为8,当我们进行存入的时候会通过Hash Code计算如果索引为空插入,不是的话就会通过equals方法来比较原来的key与插入的key一样的话直接覆盖,不一样的话,先判断这个数组下面是链表还是红黑树,如果是红黑树直接插入,不是的话开始遍历这个链表,遍历的时候判断链表长度是否大于8,是的话转换成红黑树,然后插入,不是的话链表插入插入之后会对这个数组的大小进行判断,如果键值对达到了临界值就会对HashMap进行扩容,这个临界值(threshold)=容量(capacity)*加载因子(load Factor),也就是已经占用的数组的最大值,扩容依旧是两倍。

http://www.dtcms.com/a/279851.html

相关文章:

  • kt 中商品的金额字段使用double 还是 bigdecimal
  • 动态规划题解——最长递增子序列【LeetCode】记忆化搜索方法
  • 【每日刷题】杨辉三角
  • Git根据标签Tag强制回滚版本
  • 面试常问:如何在一个长度为n的无序数据快速获取前k个数值
  • 网络传输过程
  • GaussDB between的用法
  • 光伏板如何最大化铺设?
  • 【PostgreSQL异常解决】`PostgreSQL`异常之类型转换错误
  • 记录自己在将python文件变成可访问库文件是碰到的问题
  • vert.x 官网docs, vert.x中文文档地址 vertx文档
  • 文心4.5开源之路:引领技术开放新时代!
  • 【前端:Typst】--let关键字的用法
  • 高德开放平台携手阿里云,面向开发者推出地图服务产品MCP Server
  • 外部协作不力影响项目进度,如何加强外部沟通
  • 项目进度压缩影响质量,如何平衡进度与质量
  • LeetCode|Day11|557. 反转字符串中的单词 III|Python刷题笔记
  • 稀土化合物:助力高效种植与健康养殖
  • vue笔记3 VueRouter VueX详细讲解
  • 对象的使用
  • CAN终端电阻为什么是60R+60R,而不直接用120R?
  • 前端vue对接海康摄像头流程
  • Flink窗口处理函数
  • C++-linux 5.gdb调试工具
  • 【从语言幻觉看趋势】从语言幻觉到多智能体协作:GPT多角色系统的技术演进与实践路径
  • 判断端口处于监听状态的方法
  • 腾讯云WAF域名分级防护实战笔记
  • EPLAN 电气制图(八):宏应用与变频器控制回路绘制全攻略
  • ssm学习笔记day07mybatis
  • 如何在 Shopify 中创建退货标签