LinkedList简介
LinkedList是List接口的实现类,基于双向链表实现,继承自AbstractSequentialList类,同时也实现了Cloneable、Serializable接口。此外还实现了Queue和Deque接口,可以作为队列或双端队列使用。

LinkedList的插入删除时间复杂度:
- 在头部或尾部插入删除元素,只需要修改头节点或尾节点的指针即可完成,时间复杂度为O(1);
- 在其他位置插入删除元素,需要遍历到指定位置,再修改指定节点的指针,平均要移动n/2个位置,时间复杂度为O(n)。
LinkedList没有像ArrayList有RandomAccess接口的标记,因为LinkedList基于链表实现,链表节点之间的内存地址不连续,只能通过指针来定位,因此无法实现快速随机访问。
常用方法
- public class LinkedListTest {
- public static void main(String[] args) {
- LinkedList<Integer> linkedList = new LinkedList<>();
- //添加元素
- linkedList.add(2);
- linkedList.addFirst(1);
- linkedList.add(3);
- linkedList.add(4);
- linkedList.addLast(5);
- //获取元素
- System.out.println(linkedList.get(1));
- System.out.println(linkedList.getFirst());
- System.out.println(linkedList.getLast());
- //创建双端队列
- Deque<String> deque = new LinkedList<>();
- //元素入队
- deque.offer("a");
- deque.offer("b");
- deque.offer("c");
- //获取队头元素,但不删除队头元素
- System.out.println(deque.peek());
- //元素出队
- String a = deque.poll();
- System.out.println(a);
- }
- }
复制代码 LinkedList核心源码分析
下面以JDK17的LinkedList代码进行分析。
类属性
- public class LinkedList<E>
- extends AbstractSequentialList<E>
- implements List<E>, Deque<E>, Cloneable, java.io.Serializable
- {
- //LinkedList大小
- transient int size = 0;
- //首节点
- transient Node<E> first;
- //尾节点
- transient Node<E> last;
- }
复制代码 LinkedList中的节点由Node定义:- private static class Node<E> {
- E item; //节点值
- Node<E> next; //后继节点
- Node<E> prev; //前驱节点
- Node(Node<E> prev, E element, Node<E> next) {
- this.item = element;
- this.next = next;
- this.prev = prev;
- }
- }
复制代码 构造方法
[code]//创建一个空链表对象public LinkedList() {}//传入一个集合,将集合中的元素存入链表public LinkedList(Collection |