之前面试的时候发现很多的公司对于hashMap的源码这一块问的比较多,所以自己在看HashMap源码的时候就整理了一下如果能够帮到你们理解那就很开心了
##HashMap的底层数据结构
HashMap源码解析
这里我们可以看到当我们调用HashMap的put方法的时候实际上是调用的putVal方法,在这个方法中我们看到有一个数组 Node<K,V>[] tab,还有一个Node<K,V> p,看第一行的if判断我们看到这里使用了一个HashMap的类对象,table,而这个table是什么呢?我们继续看
HashMap源码解析
然后我们看到这个table也是一个node的集合
HashMap源码解析
而这个node呢实际上是一个链表,所以我们长期说的HashMap的底层就是链表加上数组的结构
理论上这样回答是没有问题的,我们可以对这个问题进行更深入的去了解一下
HashMap源码解析
ps:关于这个put方法等一下来解析
这里先说截图的意思,这里的意思是当此时的这个节点如果在数组中有相同的hash的值的时候,并且这个节点的key对应的key值在这个队列中对应的链表里没有相同的对象而且此时数组对应的不是TreeNode结构的时候遍历这个数组对应得链表结构
当链表的长度大于等于TREEIFY_THRESHOLD(因为此处的binCount是从0开始的,所以其实也就是链表长度等于TREEIFY_THRESHOLD)
HashMap源码解析

所以也就是当数组对应的链表大于等于8的时候他就调用treeifyBin(tab, hash)方法
所以我们再看看这个方法
HashMap源码解析
HashMap源码解析
这里的操作是将数组中的hashn值对应的链表替换为红黑树,并将原来列表中的值赋值给红黑树
总结,一般来是链表加数组的内存模型,当其中某一个数组对应的链表长度等于8的时候此时这个数组对应的就不是链表结而是红黑树结构了,当使用remove方法将某一个数组对应的树结构删除少于等于6个元素的时候又会变成连边结构
ps:这里对应树结构变成链表结构在后续的remove讲解

相关文章: