说起LinkedList我们先说说他的底层实现,LinkedList底层实现使用的双向链表,方便于数据的增加和删除,在对数据进行查询时是非常不方便的,需要一个一个的变量非常影响效率,所以在大量进行增删操作时可以使用LinkedList


add方法

在说add方法之前我们先看一个Node结点类(内部类),以免后面不知道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;
        }
    }

开始正题:

  //链表长度 
  transient int size = 0;
  //指向上一个结点的指针(临时变量暂存)
  transient Node<E> first;
  //指向下一个结点的指针(临时变量暂存)
  transient Node<E> last;
  
  public boolean add(E e) {
   
        linkLast(e);
        return true;
    }

在我们调用linkedlistadd方法时,在方法体中首先调用的是linklast方法:

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

当添加第一个元素时,lastnull,执行final Node<E> l = last后,l也为null,实例化一个node结点newNode,参数为头指针为l(null)数据e,尾指针null,再执行last = newNode,将这个newNode对象赋值给临时变量last,判断l是否为null,判断成立,将这个结点记做为头结点赋值到临时变量first中。
添加第二个元素时,last为上个结点地址,执行final Node<E> l = last后,l也为上一个结点的地址,实例化一个node结点newNode,参数为头指针为l(上个结点的地址)数据e,尾指针null,再执行last = newNode,将新的(第二个)newNode对象赋值给临时变量last,判断l是否为null,判断不成立,执行l.next = newNode;头结点的下一个即第一个结点的尾结点等当前结点地址,从这开始已经形成了一个双向的链表,再添加新的元素操作一样。

为了方便理解简单画了个图,如下图:

以上博文都是个人理解,如有不对请留言,大家共同学习!