LinkedList源码解析
LinkedList是使用双向链表实现的。
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;
}
}
LinkedList有两个Node属性,存储头尾结点。新建集合时,头尾结点都为null.
transient int size = 0; //集合的大小
transient Node<E> first; //头结点
transient Node<E> last; //尾结点
LinkedList添加元素方法
添加方法默认的是向集合的尾部添加元素。
public boolean add(E e) {
linkLast(e);
return true;
}
void linkLast(E e) {
final Node<E> l = last; //记录最后一个结点,等下作为倒数第二个结点
final Node<E> newNode = new Node<>(l, e, null); //把新添加的元素作为最后一个结点
last = newNode; //最后一个结点的指向为新增的结点
if (l == null)
first = newNode; //集合为空的话,头结点指向新添加的结点
else
l.next = newNode; //原始最后一个结点的下一个结点指向新添加的结点
size++;
modCount++;
}
图示
---------------
我每一次回头,都感觉自己不够努力,所以我不再回头。
---------------