2021-01-22:java中,HashMap的写流程是什么?
福哥答案2021-01-22:
jdk1.7写流程:
1.如果table数组为空,table数组初始化,调用inflateTable方法。
2.如果key为null,调用putForNullKey()方法,表示插入一个键为null的键值对。否则就是步骤3。
3.根据key计算hash,调用hash()方法。
4.计算下标,调用indexFor()方法。
5.遍历链表,如果找到元素,直接替换旧值。然后调用recordAccess()空方法。
6.没找到元素时,modCount自增。
7.新增元素,调用addEntry()方法。
7.1.是否需要扩容。size是否大于阈值,当前传入的下标在table中的位置不为null。如果不需要扩容,跳到步骤7.4。
7.2.扩容,调用resize()方法。
7.3.调用hash()计算哈希,调用indexFor()计算下标。
7.4.创建新的Entry节点。调用createEntry()方法。
7.4.1.获取table[新索引]
7.4.2.创建一个新的Entry对象,新索引位置的元素作为新的Entry对象的next元素,也就是说是头插法,然后赋值给table[新索引]。
7.4.3.长度加1。
jdk1.8写流程:
1.计算hash。调用hash()方法。
2.调用putVal()方法。
2.1.判断键值对数组table[i]是否为空或为null,如果是,执行resize()进行扩容;
2.2.根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向步骤2.6,如果table[i]不为空,转向步骤2.3;
2.3.判断table[i]的首个元素是否和key一样,如果相同直接覆盖value,否则转向步骤2.4,这里的相同指的是hashCode以及equals;
2.4.判断table[i] 是否为treeNode,即table[i] 是否是红黑树,如果是红黑树,则直接在树中插入键值对,否则转向步骤2.3;
2.5.遍历table[i],判断链表长度是否大于8,大于8的话把链表转换为红黑树,在红黑树中执行插入操作,否则进行链表的插入操作;遍历过程中若发现key已经存在直接覆盖value即可;
2.6.插入成功后,判断实际存在的键值对数量size是否超多了最大容量threshold,如果超过,进行扩容。
***
[HashMap源码分析(jdk7)](https://www.cnblogs.com/fsmly/p/11278561.html)
[JDK1.8中的HashMap实现](https://www.cnblogs.com/doufuyu/p/10874689.html)
[评论](https://user.qzone.qq.com/3182319461/blog/1611269769)
2021-01-22:java中,HashMap的写流程是什么?的更多相关文章
- Java中HashMap遍历的两种方式
Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...
- 【转】 java中HashMap详解
原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...
- java中HashMap详解(转)
java中HashMap详解 博客分类: JavaSE Java算法JDK编程生活 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成 ...
- java集合(2)- java中HashMap详解
java中HashMap详解 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 H ...
- Java中HashMap的实现原理
最近面试中被问及Java中HashMap的原理,瞬间无言以对,因此痛定思痛觉得研究一番. 一.Java中的hashCode和equals 1.关于hashCode hashCode的存在主要是用于查找 ...
- JAVA中hashmap的分析
从http://blog.csdn.net/luanlouis/article/details/41576373?utm_source=tuicool&utm_medium=referral学 ...
- JAVA中HashMap相关知识的总结(一)
Java中HashMap在jdk1.7和jdk1.8中的区别点: 在jdk1.7中是用数组+链表形式存储,1.8采用数组+链表/红黑树形式 Jdk1.8中由链表转为红黑树是长度大于8,由红黑树转为链表 ...
- java中HashMap的设计精妙在哪?
摘要:本文结合图解和问题,教你一次性搞定HashMap 本文分享自华为云社区<java中HashMap的设计精妙在哪?用图解和几个问题教你一次性搞定HashMap>,作者:breakDaw ...
- Java 中的运算符和流程控制
Java 中的运算符和流程控制 + 面试题 算术运算符 Java 中的算术运算符,包括以下几种: **算术运算符** **名称** **举例** + 加法 1+2=3 - 减法 2-1=1 \* 乘法 ...
- java中HashMap原理?
参考:https://www.cnblogs.com/yuanblog/p/4441017.html(推荐) https://blog.csdn.net/a745233700/article/deta ...
随机推荐
- Vue解决后台传过来的时间展示时带T
用空格替换: {{scope.row.ctime.toLocaleString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '')}} 参考作者:https: ...
- Azure DevOps - 团队成员有权限却无法看到 Azure Repo
我们需要进入Organization Settings, 在Users中找到相关的用户,确认用户Access Level是否为stakeholder. 点击最右侧三个点,Change Acce ...
- Python自动化环境搭建轻轻松松---selenium
其实安装selenium实现自动化搭建环境也不拿 一共四步 1.Python开发环境 2.安装selenium包 3.安装浏览器 4.安装你安装的浏览器驱动 一: 想要实现Python环境不可能缺席: ...
- Kubernetes 的亲和性污点与容忍
写在前面 我们在使用k8s过程中经常有这样的需求:我的k8s集群有多台服务器,配置不尽相同.我想把数据库部署到CPU.内存比较好的这几台机:我想把静态承载服务部署到有固态硬盘的机器等:而这些需求,就是 ...
- Python ArcPy批量掩膜、重采样大量遥感影像
本文介绍基于Python中ArcPy模块,对大量栅格遥感影像文件进行批量掩膜与批量重采样的操作. 首先,我们来明确一下本文的具体需求.现有一个存储有大量.tif格式遥感影像的文件夹:且其中除了 ...
- 修改host文件
host文件路径 Windows 系统:C:\Windows\System32\drivers\etc\hosts Linux 系统:/etc/hosts Mac(苹果电脑)系统:/etc/hosts ...
- QGIS 导入文本数据(WKT)
在做GIS数据处理的时候,经常会遇到原始数据是 text.csv.Excel 等格式的数据.要使用数据前提是要先转换数据. 这里是介绍用 QGIS 导入数据.打开导入方式如下(根据自己的文本类型选择不 ...
- 2023年数字化经济与管理科学国际学术会议(CDEMS2023)
基本信息 大会官网:www.cdems.org 大会时间:2023年4月21-23日 大会地点:中国开封 截稿时间:2023年4月16日(此处有变动) 接受/拒稿通知:投稿后1周 收录检索:CPCI, ...
- Unity3D中的Attribute详解(四)
本篇我们将逐一讲解Unity中经常使用的Attribute(Unity对应的文档版本为2018.1b). 首先是Serializable,SerializeField以及NonSerialized,H ...
- vue之过滤、筛选功能的实现
目录 需求 代码 需求 给定一个列表(模拟数据),根据用户输入,自动筛选输入的内容并输出到屏幕 代码 <!DOCTYPE html> <html lang="en" ...