返回
链接更进一步:探索Java集合List系列(二):LinkedList源码解析(JDK1.8)
后端
2023-12-21 15:06:41
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非常适合需要频繁插入和删除元素的场景,例如缓存和队列。