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

JAVA jdk1.8 HashMap 存值流程图解

最近面试很多人,发现都是有个大概的记忆,但是都不清晰,所以我决定整理一下,用图解的方式帮助 有缘分看到这篇文章的小伙伴 理解 hashmap里 put 存值的过程。

问到什么时候需要将链表转换成红黑树,基本大家的回答就只说到 链表长度达到8;
问到为什么需要转换红黑树,是为了解决什么场景问题,也是回答得不清楚;
但是该篇不对这些关于hashmap的相关问题梳理,因为这个已经是比较普遍的面试题了,现在学习成本非常低,随便找下都能看到相关的面试题。

 

 

可以双击原图阅读

JCccc

 

简单的文字梳理:


开始

1.判断位桶数组table是否为空  transient Node<k,v>[] table;  

1.1 如果为空,则进行第一次的扩容 ,分配默认值 数组初始容量 1 << 4 =16,同时设置扩容阀值 16*0.75


2.利用put的key值计算hash得出插入table的索引位置

2.1判断当前的 table[索引值] 是否为null,若为空,进入3步骤
2.2 如果不为空,那么需要判断是否key值已存在

2.2.1 存在 ,直接覆盖
2.2.2 不存在,进入2.3

2.3判断当前table[索引值]下是否为链表/红黑树

2.3.1 如果是链表,开始遍历链表进行插入,
插入前计算插入后链表长度是否达到8,如果大于则转换为红黑树结构,进行key & value的插入。
如果链表长度没有达到8,那么插入时查找是否已经存在key,存在则覆盖value值;不存在则进行key & value的插入。


2.3.2 如果是红黑树,那么进行key & value的插入(存在覆盖value)


3.直接创建出新的节点,进行key & value 值插入   tab[i] = newNode(hash, key, value, null);

4.判断当前容量是否已经超越了hashmap的扩容阈值(初始容量 16   * 加载因子  0.75)     if (++size > threshold)

结束

 

相关文章:

  • Java String 为什么不可变? 真的吗?
  • JAVA 将日期字符串 月份不足10月进行补0操作
  • Springboot Quartz定时任务的动态调度使用,实战详解
  • Springboot 跟着我了解下 事务 @Transactional 默认方式 Propagation.REQUIRED
  • Springboot 全局日期格式化,只需要几行小代码
  • springboot 上传文件设置文件大小限制
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • Springboot 自定义注解+AOP简单实例介绍
  • Java 将Map的toString格式字符串转为 Map
  • Java 细品 重写equals方法 和 hashcode 方法
  • Java 对象的克隆Clone和必须了解的浅拷贝与深拷贝
  • Java i++ 与 ++i
  • Java try 与 finally 对于返回值的影响
  • 手撕一道算法题 在你面前有一个n阶的楼梯,你一步只能上1阶或2阶。请问,当N=11时,你可以采用多少种不同的方式爬完这个楼梯();当N=9时呢?
  • Springboot 整合tk-mybatis , 妈妈,我再也不想敲CRUD的代码了!
  • ----------
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • angular2 简述
  • canvas 五子棋游戏
  • const let
  • css选择器
  • JAVA之继承和多态
  • PaddlePaddle-GitHub的正确打开姿势
  • springMvc学习笔记(2)
  • VuePress 静态网站生成
  • 高性能JavaScript阅读简记(三)
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 关于字符编码你应该知道的事情
  • 观察者模式实现非直接耦合
  • 官方解决所有 npm 全局安装权限问题
  • 好的网址,关于.net 4.0 ,vs 2010
  • 怎么将电脑中的声音录制成WAV格式
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #pragma once与条件编译
  • #QT项目实战(天气预报)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (4.10~4.16)
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (二)PySpark3:SparkSQL编程
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (分类)KNN算法- 参数调优
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十六)串口UART
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)大道至简,职场上做人做事做管理
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .Mobi域名介绍
  • .NET Reactor简单使用教程
  • .NET委托:一个关于C#的睡前故事
  • .Net语言中的StringBuilder:入门到精通
  • @media screen 针对不同移动设备
  • [Android]使用Retrofit进行网络请求
  • [C#] 基于 yield 语句的迭代器逻辑懒执行