部分面试资料链接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA
密码:jsam
想获得全部面试必看资料,关注公众号,大家可以在公众号后台回复“知乎”即可。
![dd2d2bb1a567ee5db894e6fa1468185e.png](https://i-blog.csdnimg.cn/blog_migrate/0d1eb1246a28aa34e7b0c04da19a0b9f.png)
List是在面试中经常会问的一点,在我们面试中知道的仅仅是List是单列集合Collection下的一个实现类, List的实现接口又有几个,一个是ArrayList,还有一个是LinkedList,还有Vector。这次我们就来看看这三个类的源码。
ArrayList
ArrayList是我们在开发中最常用的数据存储容器,它的底层是通过数组来实现的。我们在集合里面可以存储任何类型的数据, 而且他是一个顺序容器,存放的数据顺序就是和我们放入的顺序是一致的,而且他还允许我们放入null元素,我们可以画个图理解一下。
![94a72753c2373ac466509989f1517e51.png](https://i-blog.csdnimg.cn/blog_migrate/afa597b85a0175f9f8ac4cd9f575b8d7.png)
这个图可能不是很正确,里面存放的元素的引用,所以我用了个000x,大致了解一下就行,一个伪图。
这样的话我们来看看源码分析
源码分析
DEFAULT_CAPACITY 这是默认的初始容量,容量是10. EMPTY_ELEMENTDATA 这代表的是一个空的数组,初始化数组。 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 这个是区别上边的那个自定义容量为0的时候的空数组。
有些看源码的就会发现为什么初始容量为10,有会出现一堆什么空数组容量为0的呢? 这就得接下来看一下他的构造了
看这里
构造
LinkedList
首先啊,这个LinkedList它和ArrayList这数据结构是完全不一样的,ArrayList底层我们已经看过了是数组的结构,而LinkedList的底层则是链表的结构, 它可以进行高效的插入和移除的操作,他基于的是一个双向链表的结构,我们画个图理解一下。
LinkedList的Node节点结构
![388cc6337025f44e7b2fa81706dfcf37.png](https://i-blog.csdnimg.cn/blog_migrate/93b66367db94a24896545566f0a96319.png)
就和图中画的一样LinkedList是由很多个这样的节点组成的
prev是存储的上一个节点的引用。
element是存储的具体的内容。
next是存储的下一个节点的引用。
正是因为了这很多个节点,他存放着上一个和下一个节点的引用,就形成了有序的一个链表,就个铁链类似的那种,而且再加上它存的是前后两个节点的引用全部都保存起来, 所以从前往后和从后往前都能增删改查数据,所以他是个双向的链表。
我们再看看他的整体结构。
LinkedList的整体结构图
![f795fdbd2f498c24c4f0586d5ab5f183.png](https://i-blog.csdnimg.cn/blog_migrate/34845f20848d7db3593b9b28f997edf7.png)
我们从图解中也能看出点东西来,他有好多的Node,并且还有first和last这两个变量保存头部和尾部节点的信息
还有就是他不是一个循环的双向链表,因为他前后都是null,这个也是我们需要注意的地方
图解看完了,我们看看他的源码解析把。
源码分析
List中的ArrayList和LinkedList源码分析mp.weixin.qq.com![16db0f54ab4293403c1728d3a45a78b3.png](https://i-blog.csdnimg.cn/blog_migrate/2c8d5a2c7e729936ce925514837ed0b8.jpeg)
Java 极客技术公众号,是由一群热爱 Java 开发的技术人组建成立,专注分享原创、高质量的 Java 文章。如果您觉得我们的文章还不错,请帮忙赞赏、在看、转发支持,鼓励我们分享出更好的文章。
关注公众号,大家可以在公众号后台回复“知乎”,获得作者 Java 知识体系/面试必看资料。
![f0aca379279891272353274086ab1bab.png](https://i-blog.csdnimg.cn/blog_migrate/dfe42e7c99116d58dd636934b95b7aa2.jpeg)