本文只谈数据结构,先说结论:
- HashMap底层数据结构实现基于散列链表(数组 + 链表)
见:HashMap数据结构-数组+单链表.png
- HashMap底层数据结构中的链表 在Java1.8 之前是单链表,在Java1.8 之后某个链表的长度超过阈值(默认为8)并且HashMap的总size 大于64 时会替换为红黑树
见:HashMap数据结构-数组+红黑树.png


明确这两点我们再来讨论具体实现细节,首先我们来看看散列链表 这个结构中的数组 部分,切入点在java.util.HashMap#put()
→java.util.HashMap#putVal()
→java.util.HashMap#resize()
的方法调用链中,着重看java.util.HashMap#resize()
方法,梗概如下:
final Node<K,V>[] resize() {
......
//重点代码在这里,直接new了一个数组赋值给table,这个table就是我们散列链表中的数组部分
@SuppressWarnings({"rawtypes","unchecked"})
Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap];
table = newTab;
......
return newTab;
}
其次是链表/红黑树结构,切入点代码为java.util.HashMap#put()
→java.util.HashMap#putVal()
网友评论