[java源码解析]对HashMap源码的分析(一)
最近有空的时候研究了下HashMap的源码,平时我用HashMap主要拿来当业务数据整理后的容器,一直觉得它比较灵活和好用,
这样
的便利性跟它的组成结构有很大的关系。
直接开门见山,先简要说明一下HashMap的数据结构(结构层面)以及基本的实现思路(算法层面)
HashMap的数据结构是哈希表,我们都知道数组的特点是:寻址容易,插入删除困难。链表的特点是寻址困难,插入删除容易。HashMap的哈希表实现方式
折中了数组以及链表各自的优点。

上图就是HashMap的数据结构,数组+链表的形式。由上图为例,上图的数组是一个长度为8的数组,每个元素存储的是链表的头结点。链表部分存储的就是HashMap的元素,一个个元素就是一个个的实体Entry(包括key,value,next)。
数组逻辑结构部分:
那么HashMap的元素的存入数组的规则是怎样的呢。一般通过hash(key) % len 获得。
用一个公式表示就是 : index = hash(key) % len;
注:index是数组的下标,key是HashMap元素的key值,len是数组的长度。
比如上图数组的长度是8,64%8,72%8,160%8 都等于0,所以都存入数组index=0的位置里。也就是说咱们的HashMap的容器就是一个线性数组。
链表逻辑结构部分:
那么问题来了,数组怎么直接用键(key)来存取数据的,处理方式就是我们的链表部分了。比如从上图我们看到链表的每一个元素存储的就是一个Entry实体类,每个Entry包含(key,value,next)。key,value我们都很熟悉啦,不就是我们平时使用hashMap的两个属性吗。next是连接同一个index的数据,因为总存在取模一样的hash(key)呀~,比如上图的64,72,160直接的连接。从上面可以看出Entry就是HashMap键值对实现的一个基础bean。
我们上面说到HashMap的基础就是一个线性数组,这个数组就是Entry[],Map里面的内容都保存在Entry[]里面。下面是代码实现
/** * The table, resized as necessary. Length MUST Always be a power of two. */
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;
下篇我们介绍HashMap的算法层面,也就是它的实现部分。敬请期待
[java源码解析]对HashMap源码的分析(一)的更多相关文章
- [java源码解析]对HashMap源码的分析(二)
上文我们讲了HashMap那骚骚的逻辑结构,这一篇我们来吹吹它的实现思想,也就是算法层面.有兴趣看下或者回顾上一篇HashMap逻辑层面的,可以看下HashMap源码解析(一).使用了哈希表得“拉链法 ...
- 源码解析之HashMap源码
关于HashMap的源码分析,网上已经有很多写的非常好的文章了,虽然多是基于java1.8版本以下的.Java1.8版本的HashMap源码做了些改进,理解起来更复杂点,但也不脱离其桶+链表或树的重心 ...
- Java集合类源码解析:HashMap (基于JDK1.8)
目录 前言 HashMap的数据结构 深入源码 两个参数 成员变量 四个构造方法 插入数据的方法:put() 哈希函数:hash() 动态扩容:resize() 节点树化.红黑树的拆分 节点树化 红黑 ...
- JAVA常用集合源码解析系列-ArrayList源码解析(基于JDK8)
文章系作者原创,如有转载请注明出处,如有雷同,那就雷同吧~(who care!) 一.写在前面 这是源码分析计划的第一篇,博主准备把一些常用的集合源码过一遍,比如:ArrayList.HashMap及 ...
- 深入理解JAVA集合系列一:HashMap源码解读
初认HashMap 基于哈希表(即散列表)的Map接口的实现,此实现提供所有可选的映射操作,并允许使用null值和null键. HashMap继承于AbstractMap,实现了Map.Cloneab ...
- 转:【Java集合源码剖析】HashMap源码剖析
转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 您好,我正在参加CSDN博文大赛,如果您喜欢我的文章,希望您能帮我投一票 ...
- 【Java集合源码剖析】HashMap源码剖析
转载出处:http://blog.csdn.net/ns_code/article/details/36034955 HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-va ...
- jdk1.8源码解析:HashMap底层数据结构之链表转红黑树的具体时机
本文从三个部分去探究HashMap的链表转红黑树的具体时机: 一.从HashMap中有关“链表转红黑树”阈值的声明: 二.[重点]解析HashMap.put(K key, V value)的源码: 三 ...
- Spring源码解析 - AbstractBeanFactory 实现接口与父类分析
我们先来看类图吧: 除了BeanFactory这一支的接口,AbstractBeanFactory主要实现了AliasRegistry和SingletonBeanRegistry接口. 这边主要提供了 ...
随机推荐
- 单机版solr7.3
搭建Solr7.3单机版 原博客 https://blog.csdn.net/yiqing_summer/article/details/79934584 1.Solr下载:http://mirro ...
- Sql2012 AlwaysOn
准备: 两台宿主机,两台虚拟机,一根交叉线 系统都是windows server 2012 步骤 1.两台虚拟机均为双网卡 2.配置故障转移群集 3.执行AlwaysOn配置(增加Listen此步骤上 ...
- HAOI2010 最长公共子序列
题目链接:戳我 30分暴力....暴力提取子序列即可qwqwq #include<iostream> #include<cstdio> #include<algorith ...
- linux 磁盘保留空间设置
1.查看保留空间大小 tune2fs -l /dev/sda8 reserved blocks 2.调整保留空间大小(系统默认5%) tune2fs -m 0.5 /dev/sda8 参考链接:ht ...
- kali linux之Msf-exploit模块,生成payload
Exploit模块 Active exploit(主动地向目标机器发送payload并执行,使目标交出shell(反连等)) msf5 > use exploit/windows/smb/pse ...
- [ActionSprit 3.0] FMS安装与测试
1.运行Flash Media Server4.5.exe,安装选项可全默认,序列号可不填:输入用户名和密码需记住,登录时要用. 2.安装完成,在安装目录C:\Program Files\Adobe\ ...
- 网页中这 10 种字体的运用方式,不会让人觉得 Low
简评:字体特效非常多,有目的地选取合理的特效是让它们发挥效果的诀窍所在.好的字体排版是不需要辅助就能被识别的,否则这个设计是失败的. 本文转载自 UISDC,如需转载请联系他们. 对于设计师而言,在日 ...
- IOS面试题(二)
50. 谈谈对Block 的理解?并写出一个使用Block执行UIVew动画? 答:Block是可以获取其他函数局部变量的匿名函数,其不但方便开发,并且可以大幅提高应用的执行效率(多核心CPU可直接处 ...
- ubuntu16.04 能启动mysql服务
ubuntu16.04 后, 貌似mysqld在/etc/init.d下,直接执行会报mysqld不在服务中,因此开启mysql服务失败. 所以执行以下命令不能启动mysql服务: /etc/init ...
- 使用记忆化优化你的 R 代码
目录 使用记忆化优化你的 R 代码 R 中的性能优化 R 何时变慢 R 何时变(更)快 R 中的记忆化 何时使用记忆化 使用记忆化优化你的 R 代码 本文翻译自<Optimize your R ...