返回

链接更进一步:探索Java集合List系列(二):LinkedList源码解析(JDK1.8)

后端

LinkedList概览

LinkedList是一个基于节点(Node)实现的双向链表List,它允许我们在列表中的任意位置轻松地插入和删除元素。相比于ArrayList,LinkedList在插入和删除操作上具有明显的优势,但随机访问元素的速度较慢。

LinkedList的类图如下:

+----------------+
| LinkedList    |
+----------------+
    |
    v
+----------------+
| AbstractList   |
+----------------+
    |
    v
+-----------------+
| AbstractCollection |
+-----------------+
    |
    v
+-----------------+
| Collection       |
+-----------------+
    |
    v
+------------------+
| Iterable         |
+------------------+

从类图中可以看出,LinkedList实现了4个接口(Iterable、Collection、AbstractCollection、AbstractList)并继承了1个抽象类(AbstractList)。

LinkedList源码解析

节点结构(Node)

LinkedList的节点结构非常简单,它包含三个属性:

  • element: 存储元素。
  • next: 指向下一个节点。
  • prev: 指向前一个节点。
public class Node<E> {
    E item;
    Node<E> next;
    Node<E> prev;

    Node(E element, Node<E> next, Node<E> prev) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

构造方法

LinkedList的构造方法非常简单,它只有一个构造方法,用于创建一个空的链表。

public LinkedList() {
}

add方法

add方法用于在链表的尾部添加一个元素。它首先创建一个新的节点,然后将该节点添加到链表的尾部。

public boolean add(E e) {
    Node<E> newNode = new Node<>(e, null, last);
    if (last == null)
        first = newNode;
    else {
        last.next = newNode;
        last = newNode;
    }
    size++;
    return true;
}

remove方法

remove方法用于从链表中删除一个元素。它首先找到要删除的元素的节点,然后将该节点从链表中删除。

public E remove(int index) {
    checkElementIndex(index);
    return unlink(node(index));
}

get方法

get方法用于获取链表中指定位置的元素。它首先找到指定位置的节点,然后返回该节点的元素。

public E get(int index) {
    checkElementIndex(index);
    return node(index).item;
}

set方法

set方法用于设置链表中指定位置的元素。它首先找到指定位置的节点,然后将该节点的元素设置为新的元素。

public E set(int index, E element) {
    checkElementIndex(index);
    Node<E> x = node(index);
    E oldVal = x.item;
    x.item = element;
    return oldVal;
}

LinkedList的优缺点

优点:

  • 插入和删除元素非常高效,时间复杂度为O(1)。
  • 可以轻松地在链表的任意位置插入和删除元素。
  • 非常适合需要频繁插入和删除元素的场景。

缺点:

  • 随机访问元素的速度较慢,时间复杂度为O(n)。
  • 需要额外的内存来存储指向下一个和前一个节点的指针。

LinkedList的适用场景

  • 需要频繁插入和删除元素的场景,例如缓存和队列。
  • 需要在链表的任意位置插入和删除元素的场景,例如文本编辑器。
  • 需要存储大量元素的场景,例如日志文件。

总结

LinkedList是一个基于节点实现的双向链表List,它允许我们在列表中的任意位置轻松地插入和删除元素。LinkedList在插入和删除操作上具有明显的优势,但随机访问元素的速度较慢。LinkedList非常适合需要频繁插入和删除元素的场景,例如缓存和队列。