简介:岁月磨平了人的棱角,让我们不敢轻易的去放手,即使它在你心中并不那么重要,你依旧害怕失去它,不是舍不得,是内心的迷茫。              

一 : 创建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)源码解读的更多相关文章

  1. JDK容器类Map源码解读

    java.util.Map接口是JDK1.2开始提供的一个基于键值对的散列表接口,其设计的初衷是为了替换JDK1.0中的java.util.Dictionary抽象类.Dictionary是JDK最初 ...

  2. jdk 8 HashMap源码解读

    转自:https://www.cnblogs.com/little-fly/p/7344285.html 在原来的作者的基础上,增加了本人对源代码的一些解读. 如有侵权,请联系本人 这几天学习了Has ...

  3. Timer的故事----Jdk源码解读

    咱们今天也来说说定时器Timer Timer是什么? Timer  n. [电子] 定时器:计时器:计时员 从翻译来看,我们可以知道Timer的本意是,定时定点. 而JDK中Timer类也的确是这个本 ...

  4. JDK容器类List,Set,Queue源码解读

    List,Set,Queue都是继承Collection接口的单列集合接口.List常用的实现主要有ArrayList,LinkedList,List中的数据是有序可重复的.Set常用的实现主要是Ha ...

  5. Jfinal启动源码解读

    本文对Jfinal的启动源码做解释说明. PS:Jfinal启动容器可基于Tomcat/Jetty等web容器启动,本文基于Jetty的启动方式做启动源码的解读和分析,tomcat类似. 入口  JF ...

  6. AbstractQueuedSynchronizer源码解读

    1. 背景 AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)是Doug Lea大师创作的用来构建锁或者其他同步组件(信号量.事件等) ...

  7. ScheduledThreadPoolExecutor源码解读

    1. 背景 在之前的博文--ThreadPoolExecutor源码解读已经对ThreadPoolExecutor的实现原理与源码进行了分析.ScheduledExecutorService也是我们在 ...

  8. jdk1.8.0_45源码解读——HashMap的实现

    jdk1.8.0_45源码解读——HashMap的实现 一.HashMap概述 HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射操作.存储的是<key,value>对 ...

  9. 对ThreadLocal的源码解读

    早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序. 功能 ...

随机推荐

  1. 详解 CmProcess 跨进程通信的实现

    CmProcess 是 Android 一个跨进程通信框架,整体代码比较简单,总共 20 多个类,能够很好的便于我们去了解跨进程实现的原理. 个人猜测 CmProcess 也是借鉴了 VirtualA ...

  2. scss : div水平垂直居中

    scss 是一个很好用的css预处理语言,有很多很好的特性. 比如 mixin. 我们可以像使用函数那样使用mixin. 比如写一个div水平垂直居中. 上代码. @mixin absolute_ce ...

  3. ”initialization failure:0x0000000C“错误,何解?

    今天开机后打开软件,报出这样的警告”initialization failure:0x0000000C“. 我问了度娘,看了很多回答,答案参差不齐.其中,有个回答还是很不错的(刚好我的是win10系统 ...

  4. 工程能力UP | LightGBM的调参干货教程与并行优化

    这是个人在竞赛中对LGB模型进行调参的详细过程记录,主要包含下面六个步骤: 大学习率,确定估计器参数n_estimators/num_iterations/num_round/num_boost_ro ...

  5. 轻量级分布式延时任务处理组件easyTask-L-入门篇

    今天给大家介绍一款新武器.我自研的一个java组件easyTask-L.这个是做啥的呢?我之前研发了一款单机版本的easyTask,这次是要介绍另外一款easyTask-L.区别就是后者支持分布式环境 ...

  6. Docker 概念-1

    阅读本文大概需要15分钟,通过阅读本文你将知道一下概念: 容器 什么是Docker? Docker思想.特点 Docker容器主要解决什么问题 容器 VS 虚拟机 Docker基本概念: 镜像(Ima ...

  7. iOS打包测试ipa

    1. 连接iphone真机 2.选中真机, archive

  8. 将音频文件转二进制分包存储到Redis(奇淫技巧操作)

    功能需求: 一.获取本地音频文件,进行解析成二进制数据音频流 二.将音频流转化成byte[]数组,按指定大小字节数进行分包 三.将音频流分成若干个包,以List列表形式缓存到redis数据库中 四.从 ...

  9. hdu6755 Mow

    半平面交+数组模拟双端队列 人生第一次代码过两百行啊...加油加油 #include<iostream> #include<algorithm> #include<cma ...

  10. ath10k MAC地址

    使用openwrt下ath10k驱动QCA9880修改其MAC地址方式 1. 使用artGUI修改9880寄存器方法(该方法有严重后遗症,目前还没有找到修改回去的方法) 2. 使用preinit修改其 ...