HashMap源码分析。

1.HashMap(数据结构:链表散列,可变数组+链表)

《HashMap源码分析。》

  初始化大小2*4次方,最大2*30次方,默认扩容系数0.75。

《HashMap源码分析。》

  存储数据主要使用Entry<K,V>数组,数组中的每个Entry<K,V>是个链表结构。

《HashMap源码分析。》

hashmap获取数据比较简单

《HashMap源码分析。》

hashmap存入数据稍微复杂点。

《HashMap源码分析。》

看看putForNullKey,遍历Entry<K,V>数组第一个元素的所有链表,如果链表中有key也是null的数据,则进行value替换,同时返回旧value值;如果没有,把它放进到hash槽第一个位置(即数组的第一个位置),也处于链表中的第一位(注意hashmap中的链表类似与栈的结构,先增加的元素总是在最前面,后面连接着一群Entry<K,V>,如果后面没有元素,下一个元素就连接着null,这种存储方式同时也解决了Hash冲突问题)。

《HashMap源码分析。》

后续如果key不为null,则开始根据key计算hash值;在不扩容的情况下,Entry<K,V>数组的大小是固定的,这个key-value值到底要放在哪,需要通过indexFor计算出来(简称槽位),后续遍历Entry<K,V>数组的所在槽位[i]的所有链表数据(table[i]槽位如果有数据,则存放着一条链表),如果链表中某个Entry<K,V>中的key等于待放入数据的key,则替换原value值为新value值,同时返回旧value值;如果槽位i位置没有该key对应的Entry<K,V>数据,则将该key-value放到该槽位的第一个位置,后续连接其它数据或null。

《HashMap源码分析。》

    原文作者:kenick
    原文地址: https://blog.csdn.net/leadseczgw01/article/details/90383367
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞