Java集合之LinkedList源码
Doubly-linked list implementation of the {@code List} and {@code Deque} interfaces. Implements all optional list operations, and permits all elements (including {@code null}) ———— java注解
LinkedList是一个双向链表,它实现了List和Deque(双端队列)接口。都有一个previous和next, 链表最开始的部分都有一个fiest和last 指向第一个元素,和最后一个元素。
public class LinkedList<E> extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
transient int size = 0;
/**
* Pointer to first node.
*/
transient Node<E> first;
/**
* Pointer to last node.
*/
transient Node<E> last;
.
.
.
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;
}
}
}
为了方便理解就把LinkedList想象成一列车厢号打乱的火车吧,Node 就是每节车厢用于存储数据。既然是车厢那么就有连接前后车厢的挂钩,而prev,和next就是这个挂钩。增加和删除的时候,只需要更改一个prev和next,就可以实现增加和删除,所以说,LinkedList对于数据的删除和增加相当的方便。但在查找时,好比你就是列车长,从列车的车头(first)走到目标车厢,但车厢是打乱的,所以你只能从你所在车厢的车门知道下一节车厢是哪个。。。。。。。。。。灵魂画手来了
next指向了Node的地址,而pre指向了Frist的地址。这就双向的意思了,车长在First车厢,看着挂钩next就知道下节的车厢号了。车长在First里看着pre为Null,就这知道这节车厢是车头了。现在就两节车厢,所以Node车厢也就是车尾了即last。
怎么网Node车厢后面再加一节呢?即LinkedList#add(E e)方法,而它再调用linkLast(E e);
/**
* Links e as last element.
*/
void linkLast(E e) {
final Node<E> l = last; // 取到last,车尾 。l为旧的车尾
// 加入新车厢pre为 l 旧车尾的地址。因为newNode是新的last车尾,所以newNode的next = null
final Node<E> newNode = new Node<>(l, e, null);
// 更新LinedList的last
last = newNode;
if (l == null) // 则原本就没有车厢, newNode新车厢就是车头了。
first = newNode;
else // 之前有车厢, 将旧的车厢的next 指向新车尾的地址
l.next = newNode;
size++;
modCount++;
}
l.next = newNode;
size++;
modCount++;
}
// TODO