容器-ListedList头尾添加元素源码分析(八)
-
先进入addFirst的源代码
System.out.println("------------LinkedList----------"); LinkedList<String> linkedList=new LinkedList<>(); //返回列表的第一个元素(每次的元素,都加在向第一个元素的前面),就是c+b+a linkedList.addFirst("a"); linkedList.addFirst("b"); linkedList.addFirst("c"); for (String str:linkedList){ System.out.println(str);//打印出来的顺序就是:c b a }
-
addFirst的方法实现,
/** * Inserts the specified element at the beginning of this list. * * @param e the element to add */ public void addFirst(E e) { linkFirst(e); }
-
进入linkFirst看他是怎么实现的
/** * Links e as first element. */ private void linkFirst(E e) { final Node<E> f = first;//定义是没有初始化, f = first=null final Node<E> newNode = new Node<>(null, e, f);//注意这个prev=null,元素是e,next=f=null first = newNode;//假设创建一个新节点1111 if (f == null)//满足条件last=newnode=1111,也就是第一次满足,现在first=1111,last=1111,也就是指向的是本身创建的新节点 last = newNode; else//第二次添加元素开始,都是不满足条件的,都走else f.prev = newNode; size++;//然后每次size都++ modCount++; }
-
linkFirst的过程原理图
-
要结合节点类分析
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;//在这里,这个很重要,就是f=1111,然后当前新节点2222会指向下一个节点1111 this.prev = prev; } }