transient int size = 0;

Pointer to first node. Invariant: (first == null && last == null) || (first. prev == null && first. item != null)

transient Node<E> first;

Pointer to last node. Invariant: (first == null && last == null) || (last. next == null && last. item != null)

transient Node<E> last;

Constructs an empty list.

public 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;  
    }  
}

my understanding

当创建一个 LinkedList 对象

LinkedList linkedList = new LinkedList();

走默认构造器, size 为 1

执行添加操作

linkedList.add(1);

进入

void linkLast(E e) {  
    final Node<E> l = last;  // last is null, so is l.
    final Node<E> newNode = new Node<>(l, e, null);  // 构建一个节点,pre is null, element is 1, next is null.
    last = newNode;  // 让 last 指向 null
    if (l == null)  // l 为空,进入判断
        first = newNode;  // 让 first 也指向新构建的节点
    else  
        l.next = newNode;  
    size++;  
    modCount++;  
}

再执行添加操作

linkedList.add(2);

进入

void linkLast(E e) {  
    final Node<E> l = last;  // 让 l 指向 last, last 指向刚创建的节点 LinkedList$Node0517
    
    // 构建一个新节点,pre 指向 LinkedList$Node0517, element is 2, next is null.
    final Node<E> newNode = new Node<>(l, e, null);  
    
    last = newNode;  // 让 last 指向 新创建的 node:LinkedList$Node0525
    if (l == null)  
        first = newNode; 
    else  // l 不为 null
        l.next = newNode;  // 让LinkedList$Node0517的next指向LinkedList$Node0525(新创建的)
    size++;  
    modCount++;  
}