public boolean add(E e)源码分析
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
transient int size = 0;
transient Node<E> first; // 首节点
transient Node<E> last; // 尾节点
public 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); // 创建一个新节点,前驱指向 l,后继为 null
last = newNode; // 将新节点设置为链表的最后一个节点
if (l == null) { // 如果链表为空
first = newNode; // 将新节点设置为链表的第一个节点
} else {
l.next = newNode; // 否则,将原最后一个节点的后继指向新节点
}
size++; // 链表大小加一
}
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;
}
}
}

一、源码解析
1、获取最后一个节点
-
final Node
l = last; -
获取链表的最后一个节点 l
2、创建新节点
-
final Node
newNode = new Node<>(l, e, null); -
创建一个新节点,前驱指向 l,数据为 e,后继为 null
3、更新链表尾节点
-
last = newNode;
-
将新节点设置为链表的最后一个节点
4、处理链表为空的情况
- 如果链表为空(l == null),将新节点设置为链表的第一个节点(first = newNode)
5、更新原尾节点的后继
- 如果链表不为空,将原尾节点的后继指向新节点(l.next = newNode)
6、更新链表大小和修改计数器
-
size++; 链表大小加 1。
-
modCount++; 修改计数器加 1(用于迭代器的 fail-fast 机制)

浙公网安备 33010602011771号