HashMap浅析

Posted 技术talk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap浅析相关的知识,希望对你有一定的参考价值。

记得点小蓝字关注 我们

HashMap比较常用,但是具体是如何实现的,通过学习底层逻辑有了一定的了解,主要是由数组和链表实现,在这里针对HashMap做个浅析。 
结构:

上图粗略的说明HashMap中的数组,而每个数组里边是一个链表即Entry,包括:key、value、next、hash。
几个主要参数:


  1. threshold:阀值是表示达到该值时需要扩容;

  2. loadFactor:扩容因子用于计划阀值,默认是0.75;

  3. capacity:数组容量,始终是2^n。

put过程浅析

HashMap浅析

1、首先是table(实际上是一个Entry)为空时初始化数组大小inflateTable

HashMap浅析

2、计算数组下标,就是hash值与数组大小的&运算,代码很简单

HashMap浅析

3、添加到链表中addEntry

HashMap浅析

添加到链表中的操作会对现有数组大小及查询数组下标位置是否有值,同时满足则会扩容并计算新的hash和数组下标,然后再放到新的数组中。
4、数组扩容resize,将当前数组长度*2

HashMap浅析

5、放到新数组中createEntry

HashMap浅析

创建实体链表new Entry,是将新值放到链表的表头。

get过程浅析

相比较put,get就比较简单了

HashMap浅析

构造方法

拿默认方式new HashMap()进行解析。

HashMap浅析

直接调用有参构造均采用默认值。

总结

put操作主要有:
1、初始化数组及阀值;
2、计算hash值及数组下标;
3、判断数组下标位置是否存在key,若存在则新值覆盖旧值并返回旧值;
4、是否需要扩容,若扩容重新计算threshold阀值,hash值,新的数组下标;
5、若不需要扩容且不存在key则在相应数组下标位置将数据放到链表的表头;

get操作主要有:
1、计算hash值及下标;
2、找到数组下标位置,根据hash值和key遍历链表;

以上是关于HashMap浅析的主要内容,如果未能解决你的问题,请参考以下文章

HashMap源码浅析

HashMap源码阅读笔记——HashMap的实现原理浅析

hashMap底层源码浅析

HashMap源码浅析

浅析HashMap和Hashtable的区别

浅析HashMap