容器-LinkedList源码分析、添加元素(七)
-
我们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"); } }
-
进入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; } }
-
双向链表原理图:
-
看一下,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() { }
-
添加元素。
-
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; } }