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 机制)

posted @ 2024-05-07 16:17  jock_javaEE  阅读(26)  评论(0)    收藏  举报