微信小程序>新闻>资讯>「Java之HashMap源码解读」百家号
「Java之HashMap源码解读」百家号-微信小程序

「Java之HashMap源码解读」百家号

85

分类:新闻资讯

开发作者: 「Java之HashMap源码解读」百家号

发布时间: 2019-04-10 11:17:21

更新时间: 2019-04-10 11:17:21

查看要求: 微信app最新版本

更多信息: 关于「Java之HashMap源码解读」百家号

「Java之HashMap源码解读」百家号-微信小程序二维码

微信扫码体验

「Java之HashMap源码解读」百家号小程序介绍

「Java之HashMap源码解读」百家号_作者自评:

如何看待百家号Lite小程序热议话题「Java之HashMap源码解读」
前言
在Java集合中,Map是一种特殊的集合,原因在于这种集合容器并不是保存的单个元素,而是一个个的key-value键值对。HashMap是基于哈希表的Map接口的实现,在项目开发中,这种集合使用是非常广泛的,本文主要就是对HashMap的底层原理做个剖析。
说明
本文解读的是HashMap的源代码,实际上在Java中,HashSet的底层就是HashMap,并且HashSet仅仅使用HashMap的key作为集合中的元素。所以当我们对HashMap有深入的理解之后,HashSet也就是自然理解了。
HashMap特点
HashMap是基于哈希表的Map接口实现。HashMap底层采用的是Entry数组和链表实现。HashMap是采用key-value形式存储,其中key是可以允许为null但是只能是一个,并且key不允许重复(如果重复则新值覆盖旧值)。HashMap是线程不安全的。HashMap存入的顺序和遍历的顺序有可能是不一致的。HashMap保存数据的时候通过计算key的hash值来去决定存储的位置。HashMap源代码
要看HashMap的源代码,我们还是从HashMap的构造方法开始一步一步的讲解。
小总结:可以看出HashMap构造的时候会初始化16个容量,并且负载因子是0.75。负载因子是什么呢?我们后面讲。小总结:这个构造方法没有什么可说的,只是多了些验证。在这里呢?构造方法就算初始化完毕了。
我们知道HashMap最常用的方法也就是put方法了,那么下面我们就着重去探究一下put方法的实现原理,也就是对HashMap的一个透彻理解。
put方法注释说明
这段代码好好的研读,请仔细往下看:
第一步
:直接判断table==EMPTY_TABLE,那么这个table是什么呢?看下图:
那么这个Entry又是说什么东东呢?
这个Entry是Map的一个静态内部类,里面最重要的属性有key、value和next三个属性值,在这里,我想大家已经猜到了,这个key和value是不是我们put的时候的key和value呢?答案是的,这个next又是干嘛用的呢?实际上这个Entry的的数据结构是一个单链表,这个next的属性的值还是这个Entry,表示的是当前的节点的下一个节点是哪个Entry。
好啦,源代码看到这里,我们知道,在put方法中,直接判断table是否为null,那么很显然到目前为止我们的table肯定是为null的,那么继续看如果table为null则要执行的代码。看下图:
哇塞,可以很直观的看到,我们实际上是初始化了一个Entry数组,而我们HashMap中的数据都是保存在了Entry[]里面了。
小总结:HashMap其实就是一个线性的Entry数组,而在Entry这个对象中保存了key和value,至于Entry对象中的next的具体作用是干嘛的,稍等做介绍哦。第二步
:判断key是否为null。从这里可以看出,当判断key如果为null的话,并没有抛出什么异常错误,很显然HashMap是支持key为null的。那么就来看看key如果为null,会怎么处理呢?
小总结:首先去循环遍历这个Entry数组,判断是否有key为null的情况,如果有则新值覆盖掉旧值。如果没有key为null的情况,则hash值为0,数据存储在这个Entry数组的第0个位置,也就是table[0],具体方法可以查看addEntry方法,在这里呢,我就不再演示了。
第三步
:通过hash方法对key进行计算hash散列值,并且根据这个散列值查找这个要保存的值应该存储到table这个数组中的哪个索引位置。
第四步
:循环变量这个Entry数组,并且判断是否有重复的元素添加进去。
小总结:当去变量这个Entry数组的时候,去判断两个Entry对象的key的hash是否相同则仅仅表示它们的存储位置是相同的,然后继续判断两个Entry的key是否相等或者equals是否相等,如果条件都满足,则表示要添加的元素,key已经重复,则直接将新值覆盖掉旧值,并且return返回,一旦条件不满足,则直接将添加的元素添加到Entry对象中。好啦,这个就是整个HashMap的底层原理。现在有的朋友可能会有产生这样的问题:如果计算的key的hash值相等,但是equals方法不相等,那么计算出来的要存储的位置不就冲突了吗?那么如果保存呢?
解决:实际上这种担忧是有必要的,因为我们完全有可能就是说计算的key的hash值和另一个key的hash值是相等的,那么这个时候呢,如果key的equals方法又不相等,那么这个时候我要保存的value值应该存储到table中的哪个索引上呢?实际上,这种情况叫做hash冲突,学习过数据结构的朋友应该都知道,解决hash冲突的方法有很多,但是在Java中,解决冲突的办法是采用的是链表来解决的。还记得这个Entry的next属性吗?对了,这个next属性就是用来记录这个链表上的下一个Entry。
好啦,本文就是对所有的内容了,看了源代码,大家是不是有恍然大悟的感觉呢?每日一题
关于static修饰符,下面描述错误的是()
A、可用于修饰类名。
B、可用于修饰类的成员变量。
C、可用于修饰静态代码块。
D、可以修饰成员方法,如果再加上public修饰,那么可以被子类重写。
该话题由百家号作者小码哥编程学习「简介:专注编程经验学习和分享,视频在线教育。」整理发布
更多有关Java之HashMap源码解读的话题讨论请关注百家号Lite小程序

「Java之HashMap源码解读」百家号_使用指南:

步骤1:微信扫描「Java之HashMap源码解读」百家号小程序码即可使用;

步骤2:微信搜索「Java之HashMap源码解读」百家号小程序名称即可使用;

步骤3:微信网页访问即速商店-长按识别「Java之HashMap源码解读」百家号小程序码即可使用。

「Java之HashMap源码解读」百家号_服务声明:

本服务由「Java之HashMap源码解读」百家号小程序开发者向微信用户提供,并对本服务信息内容、数据资料及其运营行为等的真实性、合法性及有效性承担全部责任。

"「Java之HashMap源码解读」百家号"由开发者"「Java之HashMap源码解读」百家号"原创首发于微信小程序商店shop.jisuapp.cn,转载请注明出处。

「Java之HashMap源码解读」百家号小程序截图

「Java之HashMap源码解读」百家号小程序评分

4.6

共收到5条评价

5星3条

4星2条

3星0条

2星0条

1星0条

「Java之HashMap源码解读」百家号小程序评论

请给小程序评分

  • ※裁决↗轮回﹌2019-06-18 02:14:17

    这个「Java之HashMap源码解读」百家号小程序的页面我很喜欢,赞!

  • 魔夜战队2019-06-18 02:10:38

    这「Java之HashMap源码解读」百家号是很给力的小程序,简直逆天了。

  • 蠢到吓死人づ2019-06-18 02:07:20

    真的是被「Java之HashMap源码解读」百家号小程序的强大功能吸引到了,双击666

  • 謿爆尐の酷2019-06-18 02:06:23

    「Java之HashMap源码解读」百家号真的是一个特别好用的小程序,为小程序疯狂打call!

  • 女人得有范儿2019-06-18 02:06:18

    「Java之HashMap源码解读」百家号是不错的小程序,写得轻而快,真正体现了小程序的优点,666

提交小程序关注微信

海量浏览,人人体验

提交申请

入驻催审,首页推荐