集合List LinkedList源码分析
type
status
date
slug
summary
tags
category
icon
password
前言
LinkedList
是Java
中双向链表的实现,它实现了List
接口并且允许内部元素为空,学过数据结构的同学很清楚,讲数据结构时第一个学的是数组接下来是链表,老师会把链表和数组做对比他们都属于线性数据结构,并且实现上各有千秋,简单来说如下ArrayList
:增删效率低,但是改查效率高
LinkedList
:增删效率高,但是该查效率低
时间复杂度
Ops | Time Complexity |
prepend | O(1) |
append | O(1) |
lookup | O(n) |
insert | O(1) |
delete | O(1) |
变量
构造函数
增
删
改
查
总结
LinkedList
中比较复杂难理解的函数是addAll
概括的说,
LinkedList
是线程不安全的,允许元素为null
的双向链表。
其底层数据结构是链表,它实现List<E>
, Deque<E>
, Cloneable
, java.io.Serializable
接口,它实现了Deque<E>
,所以它也可以作为一个双端队列。和ArrayList
比,没有实现RandomAccess
所以其以下标,随机访问元素速度较慢。因其底层数据结构是链表,所以可想而知,它的增删只需要移动指针即可,故时间效率较高。不需要批量扩容,也不需要预留空间,所以空间效率比
ArrayList
高。缺点就是需要随机访问元素时,时间效率很低,虽然底层在根据下标查询
Node
的时候,会根据index
判断目标Node
在前半段还是后半段,然后决定是顺序还是逆序查询,以提升时间效率。不过随着n的增大,总体时间效率依然很低。当每次增、删时,都会修改
modCount
。LinkedList
是双向列表。- 链表批量增加,是靠for循环遍历原数组,依次执行插入节点操作。对比ArrayList是通过System.arraycopy完成批量增加的。增加一定会修改modCount。
- 通过下标获取某个node 的时候,(add select),会根据index处于前半段还是后半段 进行一个折半,以提升查询效率
- 删也一定会修改modCount。 按下标删,也是先根据index找到Node,然后去链表上unlink掉这个Node。 按元素删,会先去遍历链表寻找是否有该Node,考虑到允许null值,所以会遍历两遍,然后再去unlink它。
- 改也是先根据index找到Node,然后替换值。改不修改modCount。
- 查本身就是根据index找到Node。
- 所以它的CRUD操作里,都设计到根据index去找到Node的操作。
Loading...