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  阅读(18)  评论(0)    收藏  举报