LinkedList集合详解
在讲LinkedList源码之前,先讲一下链表:
LinkedList是基于链表结构的一种List,在分析LinkedList源码前有必要对链表结构进行说明。
链表的概念:
链表是由一系列非连续的节点组成的存储结构,这里主要讲的是单向链表、单向循环列表、双向链表、双向循环列表
1、单向链表
单向链表就是通过每个结点的指针指向下一个结点从而链接起来的结构,最后一个节点的next指向null。
````
2、单向循环列表
单向循环列表就是通过每个节点的指针指向下一个节点从而链接起来的结构,最后一个节点的next指向链表开始的元素
3、双向链表
双向链表是具有两个指针的,一个是next指针,一个是pre指针,第一个的pre只想是null,最后一个next的也指向的是null
4、双向循环列表
双向循环链表的next指针,指向的是链表的第一个节点,同样的pre指向的是最后的节点
LinkedList简介
1、 LinkedList类定义。
LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
LinkedList 实现 List 接口,能对它进行队列操作。
LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。
LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
LinkedList 是非同步的。
2、成员变量说明
`transient int size = 0;`
/**
* Returns the number of elements in this list.
*
* @return the number of elements in this list
*/
public int size() {
return size;
}
通过注释size用来记录元素的数量
first当前链表中的第一个元素
last当前链表中的最后一个元素
3、无参构造器
无参构造器,构造一个空链表
4、有参构造器
5、函数方法
5.1、linkFirst
头插入,先把第一个元素赋值给f,然后新建一个node节点,然后把pre赋值为空,把e赋值给element,f就做为当前节点的下一个节点元素
5.2、linkLast
尾插入,和头插入相反,先把最后一个元素赋值给l,然后新建 一个node节点,然后把next赋值为空,把e赋值给element,l就作为当前节点的上一个节点
5.3.linkBefore
添加到指定节点之前,具体逻辑不做赘述
5.4、linkLast
添加到指定节点之后,具体逻辑不做赘述
5.5、unlinkFirst
5.6、unlinkLast
6、小结LinkedList特点
(1)LinkedList的底层结构为双向链表,将零散的内存单元通过附加的引用关联起来体现出其顺序性,相比数组的连续空间存储,链表对内存的利用率更高;
(2)有序:插入元素的顺序和取出顺序一致;
(3)可重复:可以插入相同的元素(元素值也允许为null);
(4)插入、删除操作效率高,和ArrayList恰恰相反,按索引查找效率较低;
(5)线程不安全:没有线程锁,多个线程同步进行写操作的时候可能导致数据错误;
(6)使用场景:不会随机访问数据,更多的插入删除操作,更少的查询读取操作。