HahMap(jdk=1.8)源码解读
简介:岁月磨平了人的棱角,让我们不敢轻易的去放手,即使它在你心中并不那么重要,你依旧害怕失去它,不是舍不得,是内心的迷茫。
一 : 创建HashMap
HashMap<Object, Object> hashMap = new HashMap<>();
:
源码1
解读:初始化this.loadFactor(0.75),改值做为一个负载因子,当负载比数大于它时,就会扩容一倍数组容量( >>1)
二:插入新值到HashMap中
hashMap.put(1, 1);
hashMap.put(2, 1);
源码2:
解读:仅计算了key的hash值,然后传递给下面代码

解读:
步骤1.第一个IF判断赋值后判断table是否为null --> true {初始化table(resize)和赋值n}
步骤2.第二个IF(通过数组长度和key的hash值的位运算与&,计算key所在的数组索引->赋值并判断改位置是否位null)?-->true{若为null,说明key不存在,新建node节点并赋值改数组位置}
步骤3.承接2的第二个IF == false,即该位置存在数据节点p。第三个IF(通过短路与(&&)判断p的hash值和p的key值和参数key是否相等)-->true{说明key已经存在,并赋值e位该节点}
步骤4.承接3的第三个IF == false, 即该节点P的key不是不参数key。else if (判断该节点P是否位树节点) -->true{是树节点,把新值插入树节点,并返回值赋值给e}
步骤5.承接4的else if == false,即该节点是链表节点。然后for迭代链表节点然后判断,第一个IF(判断该节点的下一个节点是否位null)?-->true{新建节点值并赋值给节点} ,紧跟第二个IF(判断迭代的次数是否大于(8-1)即8次)?-->true{说明该链表长度大于8,然后链表转换为红黑树},然后迭代结束。第三个IF,承接第一个IF即该节点不为null,然后步骤3判断一样
步骤6.IF判断e是否不为null?-->true{旧值返回,并退出}
步骤7.承接第二步的 IF == true,说明在数组的新的位置插入了新数据,然后IF判断(数组的填充数是否大于数组的长度乘以负载因子)?-->true{扩容数组}
步骤8.空的方法
三:获取HashMap中的值
hashMap.get(1);

解读:计算key的hash值,并把hash值和key传入getNode方法

解读:
步骤1.第一个IF(利用短路与(&&)判断table是否为null和table的长度和位运算与(&)找出hash值对应的数组索引并赋值first判断是否位null)
步骤2.承接步骤1 if==true,IF(判断key是否相等)?-->true{返回该节点}
步骤3.承接步骤2 IF == false,第一个IF(赋值并判断为 null),第二个IF(判断该节点是否位树节点)?-->true{通过树查找并返回退出},第三个IF 在do{}while内,承接第二个IF==false,即链表节点,查找并返回退出
步骤4.返回null,即查找的值不存在
HahMap(jdk=1.8)源码解读的更多相关文章
- JDK容器类Map源码解读
java.util.Map接口是JDK1.2开始提供的一个基于键值对的散列表接口,其设计的初衷是为了替换JDK1.0中的java.util.Dictionary抽象类.Dictionary是JDK最初 ...
- jdk 8 HashMap源码解读
转自:https://www.cnblogs.com/little-fly/p/7344285.html 在原来的作者的基础上,增加了本人对源代码的一些解读. 如有侵权,请联系本人 这几天学习了Has ...
- Timer的故事----Jdk源码解读
咱们今天也来说说定时器Timer Timer是什么? Timer n. [电子] 定时器:计时器:计时员 从翻译来看,我们可以知道Timer的本意是,定时定点. 而JDK中Timer类也的确是这个本 ...
- JDK容器类List,Set,Queue源码解读
List,Set,Queue都是继承Collection接口的单列集合接口.List常用的实现主要有ArrayList,LinkedList,List中的数据是有序可重复的.Set常用的实现主要是Ha ...
- Jfinal启动源码解读
本文对Jfinal的启动源码做解释说明. PS:Jfinal启动容器可基于Tomcat/Jetty等web容器启动,本文基于Jetty的启动方式做启动源码的解读和分析,tomcat类似. 入口 JF ...
- AbstractQueuedSynchronizer源码解读
1. 背景 AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)是Doug Lea大师创作的用来构建锁或者其他同步组件(信号量.事件等) ...
- ScheduledThreadPoolExecutor源码解读
1. 背景 在之前的博文--ThreadPoolExecutor源码解读已经对ThreadPoolExecutor的实现原理与源码进行了分析.ScheduledExecutorService也是我们在 ...
- jdk1.8.0_45源码解读——HashMap的实现
jdk1.8.0_45源码解读——HashMap的实现 一.HashMap概述 HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射操作.存储的是<key,value>对 ...
- 对ThreadLocal的源码解读
早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. 功能 ...
随机推荐
- javascript : 找到一个树型数据的一个节点及其所有父节点
如题. (function () { let tree = { "id": 0, "label": "all", "childre ...
- vue & 百度地图:使用百度地图
index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...
- 记录一次JSON数据处理(省市区数据)
最近在实习工作中遇到了一个需要问题:将后台返回的省市区 json 数据格式化以便前端渲染.这个问题真的是缠绕了我好几天,有思路但是思路特别模糊,今天终于解决了. 返回的数据格式如下: [ { &quo ...
- Mybatis核心模块简介
Configuration 主要字段 Environment:配置DataSource和TransactionFactory ObjectFactory:bean工厂 MapperRegistry:M ...
- 数据库(十二):pymysql
进击のpython ***** 数据库--pymysql 数据库就算是学习完毕了,但是我们学习数据库的本质是什么? 是想让数据库像文件存储一样将信息存储起来供我们调用 那回归本行,我就应该是用pyth ...
- Laragon修改配置快速创建其他框架的项目
配置方式 依葫芦画瓢,如添加thinkPHP: # Thinkphp Thinkphp 3.2=composer create-project topthink/thinkphp %s Thinkph ...
- layer弹窗插件留言提交
function msgShow(getname,getuserid){ layer.open({ type: 1 //此处以iframe举例 ,title: '收件人:'+getname+'(ID: ...
- 面试(JS篇)
1.js基本类型 Boolean,Number,String,Null,Undefined,Symbol. 2.null非对象,但是typeof null 返回的是Object,原因遗留下来的一个bu ...
- 自述:自学Java应该注意什么问题?
Hello,大家好,我是若风,我是一名IT从业者,纵观当今局势,国内IT互联网行业发展是比较好的,当然学IT技术的人员也特别多,网上的学习资源也非常多,现在有很多人在学技术,想想要进入到 IT这个行业 ...
- PHP strtoupper() 函数
实例 把所有字符转换为大写: <?php高佣联盟 www.cgewang.comecho strtoupper("Hello WORLD!");?> 定义和用法 str ...