JDK1.8-HashMap源码分析
HashMap,用的再多不过的东西了,面试中也经常问到,但是总是会答不出来一个所以然,回答的都太表面,要么就表达不清楚。俗话说,表达不清或者不能够让别人听懂就是自己没有搞懂。所以我要好好整理一下HashMap了。 这篇文章以JDK1.8为基础,因为JDK1.8里面引入了红黑树,真的很有意思,如果要了解红黑树,可以去看看我写的一片文章,关于红黑树的。读懂了后再来分析HashMap会了解许多。首先对于分析任何一个源码,掌握其数据结构是最基本,也是分析源码最重要的,这是精华OK?那么HashMap的精华就是数组+链表+红黑树。 看到没有,HashMap的数据结构就是上面这个样子。它的最左边也就是它所实现的“hash”,是一个数组,这样访问某一个bucket可以达到O(1)的复杂度。右边分别对应着链表和红黑树,插入删除都非常方便,访问也非常快速。而在源码里面实际的数据结构这样子: HashMap中的经典类变量 transient Node < K , V > [ ] table ; 这个就是用来存储实际数据的,每个节点是一个Node的数据结构或者说对象吧,看你怎么理解,它只有在初次使用的时候才初始化,注意构造方法不会初始化它。而且他是一个数组,会根据需要来扩容,长度永远是2的幂。 //这个值构造方法里也没有参数指定,因为它是直接由Capacity*loadFractor