HashMap源码研究

研究HashMap的源码,主要是研究下面几个点:

get

put

table

entrySet

Entry


特别是put方法, Entry的数据结构。


jvm7和jvm8的源码是有差异的。


先说下思路。 想取的快,一定是存的时候根据了规则,能够快速定位。这个就像数据库的表建立索引一样。想查询的快,那么就要根据规则建立索引。

也就是想get快,那么就put的时候有规则,能够快速在table中进行定位,也就是快速拿到table数组的下标。


那么这个下标的数值就是根据key的值进行计算的。虚拟机每个版本的计算方式不一样。


jvm7是根据key的hash值与table的数组长度进行与操作,得到一个下标。 hash的算法就是一些位移及异或操作。

h^= (h >>> 20)

^ (h >>>

12);

       returnh ^ (h >>> 7) ^ (h>>> 4);


jvm8的hash计算公式又不一样:

return (key == null) ? 0 : (h =key.hashCode()) ^ (h >>> 16);

基本上也是位移及异或操作。


   那么get的时候,也是根据相同的hash算法,取得key对应的下标,然后就可以快速从table数组中获取到数据啦。


Entry因为是个内部类,HashMap又引用了Entry,所有我们的hashmap实例的entry是无限嵌套的。

   还有一个注意的,就是entry里面有个Entry的next属性。为什么会有这个属性呢? 大部分时候这个next是为null的。因为有时候key的hash值计算是一样的。

Map<Integer, Integer> aaaa = new HashMap<Integer,

Integer>();

      aaaa.put(3, 1);

      aaaa.put(18, 1);

比如用int类型的map很容易模拟出来。3和18的在map的hash值是一样的。这样在table数组里面的下标3的地方只有key为18的entry,那么key为3的entry呢,就是在key为18的entry的next中。 实际的table数组中的元素可能就会比真实的entry数量会少。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、HashMap概述 HashMap基于哈希表的Map接口的实现。此实现提供所有可选的映射操作,并允许使用nul...
    小陈阿飞阅读 3,798评论 0 2
  • 5.1、对于HashMap需要掌握以下几点 Map的创建:HashMap() 往Map中添加键值对:即put(Ob...
    rochuan阅读 4,082评论 0 0
  • Java集合:HashMap源码剖析 一、HashMap概述 二、HashMap的数据结构 三、HashMap源码...
    记住时光阅读 4,048评论 2 1
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 9,772评论 0 16
  • 21天的写作训练营即将闭营,回望这个月的自己,有很多感想变成了记忆,从此住在自己的笨脑袋里。作业和阅读文章本是一项...
    三丘的世界阅读 2,976评论 0 2

友情链接更多精彩内容