一、查看类的继承关系
关于Cloneable,java.io.Serializable两个接口和为什么没有实现RandomAccess接口,我们上次已经说过了,如果不是很理解,请参考上一篇文章:《java集合之ArrayList源码分析》
这次重点把LinkedList源码看一遍
先简单说明:LinkedList 内部是一个链表
LinkedList首先会继承AbstractSequentialList,并实现List和Deque接口
AbstractSequentialList类继承了 AbstractList抽象类
AbstractList会继承AbstractCollection 抽象类
AbstractCollection 类 会实现Collection接口
虽然看起来层层继承和实现接口,其实不复杂,最后是要实现Collection和List的基本操作,总的来说就是要实现集合和列表的一些基本操作。
而Deque继承了Queue,也就是队列的基本操作,为为什么LinkedList也要实现队列的基本操作呢?
Deque接口
这是LinkedList的天生优势而来的,因为是链表,可以很方便的在开头和结尾添加和删除数据,实例了Queue接口是为了让LinkedList可以模拟栈和队,而ArrayList底层是数组,所以从顶部插入数据会涉及大量的数据后移,是不合适的。
现在是不是对这个LinkedList有了更清晰的认识呢?
二、构造方法
1、无参构造方法
2、有参构造方法
这个方法会传入一个CollecTion的实现类
带参构造方法
调用的addAll方法
下面就是addAll方法的具体实现,这里涉及到了将这个集合所有的数据,遍历插入到链表当中
addAll方法
三、给链表中添加数据
看一下将数据加入到链表的方法
1、得到链表存放最后一个元素的node对象
2、根据传进来的元素组装当前node对象,然后让last的next域指向刚组装好的node对象
3、将你刚创建的node对象设置为last。
这就是一个元素加入到链表的操作。
向链表中添加数据
我们看一下这个node节点,包含了元素信息,包含了上一个节点对象,包含了下一个节点对象。
这个node的构造方法有三个参数,第一个是上一个节点对象,第二个参数是元素信息,第三个参数是下一个节点的对象。
四、从链表中删除元素的操作
因为是链表,如果要删除的话,就需要从链表头遍历数据。
删除元素方法
unlink方法是什么样呢,在进行链表元素删除的时候,是需要修改上一个节点,和下一个节点的prev和last的对象引用的。
unlink方法
五、clear方法
clear操作,很简单,将first last都设置为null,同时将所有node节点的数据全置为null,真正的删除还是通过jvm垃圾回收机制去清除的。
六、双向队列
然后有一部分接口就是双向队列的一些操作,但基本使用方法大体是一样的,只说一下插入链表头的操作。
向链表头插入数据
linkFirst方法
其实也比较简单,你自己实现一个都是可以的哦。