一直以来,hashMap源码就是备受追捧的话题,面试官的宠儿。
虽然我不太知道具体有什么作用,但是就跟初中高中的史地政生一样,用处不用考虑,应试就得了。
正好这几日工作不忙,所以我也算下定了决定要把hashMap的源码啃个明白。写这篇文章也是为了给自己一个记录的方式,毕竟好记性不如烂笔头,而纸质虽然更有仪式感可是携带又不方便。同事也算是给同样想看hashmap源码的朋友一个参考或者例子。(以下都是以jdk8作为参考)
从如何将源码变为可读说起
首先我用的是eclipse编译器。然后众所周知的如果直接打开依赖中的HashMap类,是无法直接看到源码的,会报source not found
直接打开源码
然后解决办法也简单,在此页面点击change attached source
如图点击
选择jdk目录下的src.zip
下一步如图选择external file,选择jdk目录下的src.zip,然后ok,再重新打开想看的文件就可以看到正常格式的代码了。
打开hashMap文件
HashMap的继承/实现关系
其实单独说HashMap,在java中也就是一个类,哪怕内容再多,也就是一个2392行的文件,但是其背后的继承,实现还是蛮多的,忘大了说Map家族,兄弟姐妹更多,什么HashTable,TreeMap,表亲堂亲亲兄弟一大堆。虽然我这里是主要读HashMap,可是一些基础的亲戚关系还是应该了解的。所以就从最顶级Map说起。
首先,从整体上讲,JDK中,Map是个顶级接口。好让人理解的是Map家族的成员名称也大多(除了hashTable好像剩下都是map结尾)都是以map结尾的,所以还算是好找,然后Map的继承/实现类分两大类。一种是线程安全的,位于util下的concurrent包下,还有一种就是非线程安全的,直接位于util包下。下图表示java.util下的类的层次结构
java.util的层次结构
我一直觉得map家族那么大,一口吃不成胖子,既然只解读hashMap源码,还是围绕这个为主,我们主要讲的也是直属util下的非线程安全的Map类。下面的结构图就是Map家族的结构。(我用xmind画的,只能说尽力了)
Map家族结构图
刚刚我就说了这个结构图只是直属util包下的,其实concurrentMap也是继承自Map,但是我这里就没写,感兴趣的可以自己去看看。如果图表示的不明白,还有一份记录,就是我挨个类对着记下来的,虽然有点乱,但是还蛮好懂的,另外记录是implement就是implement,是extends就是extend。
然后出了hashMap,其实别的类也都蛮有意思,比如hashMap的子类LinkedHashMap,是有序hashMap、TreeMap可对其内部元素的各种排序。反正有兴趣的可以去找,我这里回到主题:HashMap解读。
HashMap源码
未完待续,明天继续吧~~~~~~
网友评论