最近朋友说研究并发可以先从HashMap源码分析开始,所以就研究了下HashMap的结构和源码。
先从HashMap的结构开始。
我们都知道HashMap的用来存储key,value键值对数据的。既然是存储数据的,我们就得想一下数据存储的数据结构信息有哪些,我们所知道的数据存储结构有 数组,链表,树形,图形。数组查询快,增删慢。链表增删快查询慢,我们可以猜猜HashMap什么结构,可不可能是数组加链表相互结合,取两者的优势的结构。也就是数组+链表的结构。
在jdk1.8之前,hashmap的结构确实是数组加链表的,在jdk1.8的时候hashmap结构又进行了优化。由数组+链表的结构转为了在某特定情况的时候链表会转为红黑树的结构。也就是,在jdk1.8之前链表的长度是没有限制的,当数据增多,链表越长,hashmap的效率就会下降。在jdk1.8的时候,链表的长度限制为8,在超过8时,将链表的结构转成红黑树结构,提高效率,当然红黑树的结构也会有限制,节点数最低不能低于6个,当低于6时,会自动转为链表提高效率,这就是jdk1.8时hashMap很神奇的结构变化。
----------下面是分析时的概要理解-----------
我们都知道数据结构,却很少将结构具象化成代码,如下简单尝试一下。
ArrayList ---> 数组 ----> Object [ ]
LinkedList --->双向链表 ---->
class Node{
Object Data;//数据
Node previous;//上一节点信息
Node next;//下一节点信息
}
当然这只是我们将结构想象成java代码的样子,这段代码并不一定是对的。