HashMap浅析
Posted 技术talk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap浅析相关的知识,希望对你有一定的参考价值。
记得点小蓝字关注 我们
HashMap比较常用,但是具体是如何实现的,通过学习底层逻辑有了一定的了解,主要是由数组和链表实现,在这里针对HashMap做个浅析。
结构:
上图粗略的说明HashMap中的数组,而每个数组里边是一个链表即Entry,包括:key、value、next、hash。
几个主要参数:
threshold:阀值是表示达到该值时需要扩容;
loadFactor:扩容因子用于计划阀值,默认是0.75;
capacity:数组容量,始终是2^n。
put过程浅析
1、首先是table(实际上是一个Entry)为空时初始化数组大小inflateTable
2、计算数组下标,就是hash值与数组大小的&运算,代码很简单
3、添加到链表中addEntry
添加到链表中的操作会对现有数组大小及查询数组下标位置是否有值,同时满足则会扩容并计算新的hash和数组下标,然后再放到新的数组中。
4、数组扩容resize,将当前数组长度*2
5、放到新数组中createEntry
创建实体链表new Entry,是将新值放到链表的表头。
get过程浅析
相比较put,get就比较简单了
构造方法
拿默认方式new HashMap()进行解析。
直接调用有参构造均采用默认值。
总结
put操作主要有:
1、初始化数组及阀值;
2、计算hash值及数组下标;
3、判断数组下标位置是否存在key,若存在则新值覆盖旧值并返回旧值;
4、是否需要扩容,若扩容重新计算threshold阀值,hash值,新的数组下标;
5、若不需要扩容且不存在key则在相应数组下标位置将数据放到链表的表头;
get操作主要有:
1、计算hash值及下标;
2、找到数组下标位置,根据hash值和key遍历链表;
以上是关于HashMap浅析的主要内容,如果未能解决你的问题,请参考以下文章