HashMap源码解析

啃了半天的HashMap源码,以此记录一下成果

1.hashMap的数据结构是,数组加链表

嗯 也就是这个东西HashMap源码解析

table数组 加上Entry类(HashMap静态内部类,链表)

下面附上Entry的代码

HashMap源码解析

Entry一共会存储4个值,分别是key(也就是我们put时候的key),value(put时候的value),next(下一个Entry节点),hash(节点对应的hash值)。

HashMap存储数据原理:

首先HashMap会根据你传过来的key,做一个hash算法。得到一个相应的hash值。在根据你的hash值做一系列的算法(旧版本是取模,1.7版本是用与的方式计算,详见indexFor方法),决定你存储在数组的哪个下标。

Hash冲突(Hash碰撞):HashMap用数组加链表的数据结构就是用来解决Hash冲突问题的,即如果一个key1通过hash算法得到的值是1001,key2通过hash算法得到的值也是1001,这时获取的数组下标一样,key1如果先put,key2后put,这时key2就会在key1的头部,即key2的next节点为key。这样一来就解决了Hash冲突问题。

HashMap源码解析

hash算法源码:

HashMap源码解析
 

2.get方法分析:

get方法,首先通过你的key,进行hash算法获取hash值,在通过indexFor方法找到相应的数组下标。

若一个Entry元素存在多个链节点,再根据你的key值去遍历整个链表,找寻链表节点的key与当前需要查找的key相同的元素并获取到他的值。

get方法核心源码:

HashMap源码解析