福哥答案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的写流程是什么?的更多相关文章

  1. Java中HashMap遍历的两种方式

    Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...

  2. 【转】 java中HashMap详解

    原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...

  3. java中HashMap详解(转)

    java中HashMap详解 博客分类: JavaSE Java算法JDK编程生活       HashMap 和 HashSet 是 Java Collection Framework 的两个重要成 ...

  4. java集合(2)- java中HashMap详解

    java中HashMap详解 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 H ...

  5. Java中HashMap的实现原理

    最近面试中被问及Java中HashMap的原理,瞬间无言以对,因此痛定思痛觉得研究一番. 一.Java中的hashCode和equals 1.关于hashCode hashCode的存在主要是用于查找 ...

  6. JAVA中hashmap的分析

    从http://blog.csdn.net/luanlouis/article/details/41576373?utm_source=tuicool&utm_medium=referral学 ...

  7. JAVA中HashMap相关知识的总结(一)

    Java中HashMap在jdk1.7和jdk1.8中的区别点: 在jdk1.7中是用数组+链表形式存储,1.8采用数组+链表/红黑树形式 Jdk1.8中由链表转为红黑树是长度大于8,由红黑树转为链表 ...

  8. java中HashMap的设计精妙在哪?

    摘要:本文结合图解和问题,教你一次性搞定HashMap 本文分享自华为云社区<java中HashMap的设计精妙在哪?用图解和几个问题教你一次性搞定HashMap>,作者:breakDaw ...

  9. Java 中的运算符和流程控制

    Java 中的运算符和流程控制 + 面试题 算术运算符 Java 中的算术运算符,包括以下几种: **算术运算符** **名称** **举例** + 加法 1+2=3 - 减法 2-1=1 \* 乘法 ...

  10. java中HashMap原理?

    参考:https://www.cnblogs.com/yuanblog/p/4441017.html(推荐) https://blog.csdn.net/a745233700/article/deta ...

随机推荐

  1. cenos7配置epel源

    1.首先进入/etc/yum.repos.d/目录下,新建一个repo_bak目录,用于保存系统中原来的repo文件 [root@bogon ~]# cd /etc/yum.repos.d/ [roo ...

  2. python调用adb shell

    最近在用python做一个小工具,自动执行一些adb shell命令,使用subprocess.Popen来实现. 不过遇到个问题就是执行adb shell后就无法执行后面adb shell里的命令了 ...

  3. python代码换行问题(用‘\’来达成)

    在 Python 中,可以使用反斜杠符号 '\' 来表示代码换行,从而实现在代码中进行换行,并保持语句的完整性.例如:. # 使用反斜杠符号进行换行 result = 10 + \ 20 + \ 30 ...

  4. 【读书笔记】Young Tableau_Calculus of tableaux_bumping and sliding

    目录 bumping Schensted bumping algorithm 举例 sliding/digging a hole 一些定义 Schiitzenberger sliding algori ...

  5. SpringBoot 整合 Avro 与 Kafka

    更多内容,前往IT-BLOG [需求]:生产者发送数据至 kafka 序列化使用 Avro,消费者通过 Avro 进行反序列化,并将数据通过 MyBatisPlus 存入数据库. 一.环境介绍 [1] ...

  6. 2PC(两阶段提交)【XA 与 Seata方案】

    更多内容,前往 IT-BLOG 一.概述 2PC(two phase commit protocol,2PC)即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase).提 ...

  7. 记录hive一次数据倾斜问题的解决以及思考总结

    解决数据倾斜是大数据开发中比较重要的能力,这个现象指的是分布式集群中,由于数据分发的不当,导致某个节点要处理的错误过多,导致整个计算机任务迟迟结束不了,甚至可能节点出现OOM使得任务失败 处理数据倾斜 ...

  8. 经GitHub将kubernetes镜像推送到阿里云

    背景 在安装kubernetes时会出现无法访问镜像站的情况,通过GitHub将kubernetes镜像推送到阿里云之后,即可使用阿里云地址引用所需镜像,现已同步镜像5000+,当前还在陆续同步.仓库 ...

  9. 一键部署十个服务脚本--可拆分---java+mysql+redis+nginx+rocketmq..等等

    java + mysql +redis + minio + nginx + rocketmq + rocketmq-console + elasticsearch + kibana + logstas ...

  10. 【JavaSE】Java常用类

    1.String的特性 代表字符串,java中所有字符串字面值都作为此类的实现例实现.String是一个final类,不能被继承.String实现了Serialiable,表示字符串支持序列化,实现了 ...