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为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. 功能 ...
随机推荐
- 在docker中写个Hello World
Hello World Docker 示例 准备hello.cpp #include<stdio.h> int main(){ printf("Hello World Docke ...
- TeamViewer如何绑定谷歌二次验证码/谷歌身份验证?
1.下载TeamViewer,找到谷歌二次验证界面 下载.注册TeamViewer后,点击右上角账户名-“编辑配置文件” [常规]-“双重验证”,点“启用” 进入[激活双重验证]界面,点“启动激活 ...
- 【IDEA】HTML通过servlet3.0注解名提交表单到servlet类找不到页面的问题
IDEA一时爽,摸不着头的BUG火葬场 这个问题困扰我整整一天一夜,先是代码检查路径设置找不出问题,后面换tomcat版不行,抱着侥幸心理换IDEA版本意料之中还是没解决问题. 都快想秃了最后终于完美 ...
- 第37课 智能指针分析(指针特征操作符( -> 、 *)重载)
1. 永恒的话题:内存泄漏 (1)动态申请堆空间,用完后不归还 (2)C++语言中没有垃圾回收的机制 (3)指针无法控制所指堆空间的生命周期------------指针是变量,可以指向内存堆空间,但是 ...
- 第十章 函数式接口&Stream流
10.1.函数式接口 10.1.1.概述 有且仅有一个抽象方法的接口,并且可以通过在类上标注@FunctionalInterface注解进行检测,建议自定义的函数式接口都加上这个注解 10.1.2.函 ...
- Python 数字类型转换
Python数字类型转换: int(x):将 x 转换为一个整数 float(x):将 x 转换为一个浮点数 complex(x,y):将 x 和 y 转换为一个复数.x 为复数的实部,y 为复数的虚 ...
- PHP Cookie是什么
PHP Cookie cookie 常用于识别用户. Cookie 是什么? cookie 常用于识别用户.cookie 是一种服务器留在用户计算机上的小文件.每当同一台计算机通过浏览器请求页面时,这 ...
- PHP fileperms() 函数
定义和用法 fileperms() 函数返回文件或目录的权限. 如果成功,该函数以数字形式返回权限.如果失败,则返回 FALSE. 语法 fileperms(filename) 参数 描述 filen ...
- PHP tempnam() 函数
定义和用法 tempnam() 函数在指定的目录中创建一个具有唯一文件名的临时文件. 该函数返回新的临时文件名,如果失败则返回 FALSE. 语法 tempnam(dir,prefix) 参数 描述 ...
- PDOStatement::setFetchMode
PDOStatement::setFetchMode — 为语句设置默认的获取模式.(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)高佣联盟 www.cgewang. ...