容器-LinkedList源码分析、添加元素(七)

容器-LinkedList源码分析、添加元素(七)

  1. 我们Ctrl+鼠标左键点击LinkedList对象,看源码。

    public class LinkedListTest {
          
          
        public static void main(String[] args) {
          
          
            List<String> list= new LinkedList<>();
            //添加元素
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("a");
        }
    }
    
  2. 进入LinkedList的源码,在用Ctrl+F搜索class Node,j也就是节点类

      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;
            }
        }
    
    
  3. 双向链表原理图

在这里插入图片描述

  1. 看一下,LinkedList的继承结构和成员变量

    public class LinkedList<E>
        extends AbstractSequentialList<E>//LinkedList继承了AbstractSequentialList类
        implements List<E>, Deque<E>, Cloneable, java.io.Serializable
    {
          
          		//实现了 List<E>, Deque<E>接口
        transient int size = 0;// size 记录链表节点的个数
        /**
         * Pointer to first node.
         * Invariant: (first == null && last == null) ||
         *            (first.prev == null && first.item != null)
         */
        transient Node<E> first;//first记录节点的第一对象
    
        /**
         * Pointer to last node.
         * Invariant: (first == null && last == null) ||
         *            (last.next == null && last.item != null)
         */
        transient Node<E> last;//last记录节点的最后一个对象
    
        /**
         * Constructs an empty list.
         */
        public LinkedList() {
          
          
        }
        
    
  2. 添加元素

    • Ctrl+鼠标左键点击add,进入List的实现接口,在用Ctrl+Alt选择LinkedListj接口实现类,进入源代码

          public boolean add(E e) {
              
              
              linkLast(e);//在链表的后侧添加元素
              return true;
          }
      
    • 进入 linkLast看他是怎么添加元素的。

      **
           * Links e as last element.
           */
          void linkLast(E e) {
              
              		
              final Node<E> l = last;//在定义是没给初始化,所以last为空。所以l=null
              final Node<E> newNode = new Node<>(l, e, null);
          //这时l=null,也就是prev为null(空),元素为e,next为null
          //现在假设newNode=1111
       
              last = newNode;//现在就是last=1111
              if (l == null) //l是等于null,所以满足条件
                  first = newNode;//所以first=1111
              else
                  l.next = newNode;
              size++;//然后size由0变成了1
              modCount++;
          }
      
    • 过程整体分析

在这里插入图片描述

  • 结合节点类分析

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

猜你喜欢

转载自blog.csdn.net/Xun_independent/article/details/114695393