java linkedlist源码分析_java集合之LinkedList源码分析

一、查看类的继承关系

fa6314791f807c23505f63dd828c889e.png

关于Cloneable,java.io.Serializable两个接口和为什么没有实现RandomAccess接口,我们上次已经说过了,如果不是很理解,请参考上一篇文章:《java集合之ArrayList源码分析》

这次重点把LinkedList源码看一遍

先简单说明:LinkedList 内部是一个链表

LinkedList首先会继承AbstractSequentialList,并实现List和Deque接口

AbstractSequentialList类继承了 AbstractList抽象类

45d70fbdd67c1222b7a70a7ec4b5a11b.png

AbstractList会继承AbstractCollection 抽象类

b4ed80583182723efe999f115ef935d9.png

AbstractCollection 类 会实现Collection接口

9b458f47db7472ec3952f5e1a8ece707.png

虽然看起来层层继承和实现接口,其实不复杂,最后是要实现Collection和List的基本操作,总的来说就是要实现集合和列表的一些基本操作。

而Deque继承了Queue,也就是队列的基本操作,为为什么LinkedList也要实现队列的基本操作呢?

e8746ef72c2b17e644c5970f4fb9d776.pngDeque接口

这是LinkedList的天生优势而来的,因为是链表,可以很方便的在开头和结尾添加和删除数据,实例了Queue接口是为了让LinkedList可以模拟栈和队,而ArrayList底层是数组,所以从顶部插入数据会涉及大量的数据后移,是不合适的。

现在是不是对这个LinkedList有了更清晰的认识呢?

二、构造方法

f6d3dbe32f25c63f4d33dab399fe2102.png

1、无参构造方法

81535f8ee61e218f1a6501a7bd456c8c.png

2、有参构造方法

这个方法会传入一个CollecTion的实现类

d501208bd0cf4a8b8559bd7235009195.png带参构造方法

8e7bf96df5f3b1f5ce0c27e2b2a4c8a8.png调用的addAll方法

下面就是addAll方法的具体实现,这里涉及到了将这个集合所有的数据,遍历插入到链表当中

1d32a536987042ab51083bc1e197b2b6.pngaddAll方法

三、给链表中添加数据

98f95a526fa59150dfc73c92245bc992.png

看一下将数据加入到链表的方法

1、得到链表存放最后一个元素的node对象

2、根据传进来的元素组装当前node对象,然后让last的next域指向刚组装好的node对象

3、将你刚创建的node对象设置为last。

这就是一个元素加入到链表的操作。

5cc9ab9e8220d486b3f032d25d916432.png向链表中添加数据

我们看一下这个node节点,包含了元素信息,包含了上一个节点对象,包含了下一个节点对象。

这个node的构造方法有三个参数,第一个是上一个节点对象,第二个参数是元素信息,第三个参数是下一个节点的对象。

847d2baf114b382ec64646a1bc0bd8ed.png

四、从链表中删除元素的操作

因为是链表,如果要删除的话,就需要从链表头遍历数据。

9024842ce30d60dd603b3c15750b879c.png删除元素方法

unlink方法是什么样呢,在进行链表元素删除的时候,是需要修改上一个节点,和下一个节点的prev和last的对象引用的。

adc93c89ef0c6d05d104f30d026fe9f5.pngunlink方法

五、clear方法

clear操作,很简单,将first last都设置为null,同时将所有node节点的数据全置为null,真正的删除还是通过jvm垃圾回收机制去清除的。

712e6a47c72cc63bccdfe415bcce8e8a.png

六、双向队列

然后有一部分接口就是双向队列的一些操作,但基本使用方法大体是一样的,只说一下插入链表头的操作。

c3e9293a047f3e19743c9b0bf018a972.png向链表头插入数据

6f19c9713e65301d99be10276c5222d8.pnglinkFirst方法

其实也比较简单,你自己实现一个都是可以的哦。

88dc06ee82c5930d50d8aa9287a9aa3f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值