對於要有紮實的java基礎,集合是必須掌握的,並且精讀這部分的源碼頗有用,也頗有必要。而LinkedList是在java.util包下,和java.io,java.lang都是比較經常使用,並且比較簡單。看看它們的源碼有助於鍛鍊咱們看源碼的感受,也瞭解一下大神們寫代碼的風格。看這些源碼的目的,更可能是爲了增長閱讀代碼能力。java
這裏只寫LinkedList的初始化和add()方法的源碼分析,先放一張Collection集合的分類簡圖: 函數
LinkedList採用雙向鏈表存儲方式源碼分析
缺點:遍歷和隨機訪問元素效率低下。this
優勢:插入,刪除元素效率比較高(可是前提也是必須先低效率查詢纔可,若是插入刪除發生在頭尾能夠減小查詢次數)。spa
那開始吧!指針
1 public class TestLinkedList { 2 3 public static void main(String[] args) { 4 LinkedList<Integer> list = new LinkedList<Integer>(); 5 list.add(1); 6 list.add(2); 7 list.add(3); 8 } 9 }
點進LinkedList發現只是一個構造函數,有3個變量(這裏只放部分代碼)code
1 public class LinkedList<E> 2 extends AbstractSequentialList<E> 3 implements List<E>, Deque<E>, Cloneable, java.io.Serializable 4 { 5 transient int size = 0; //默認長度0 6 transient Node<E> first; //上一個元素 7 transient Node<E> last; //下一個元素 8 9 public LinkedList() { 10 } 11 12 private static class Node<E> { 13 E item; 14 Node<E> next; 15 Node<E> prev; 16 17 Node(Node<E> prev, E element, Node<E> next) { 18 this.item = element; 19 this.next = next; 20 this.prev = prev; 21 } 22 } 23 24 25 }
Node是LinkedList的一個內部類,Node指的是雙向鏈表的結點(包括3部分,中間數據item,左右兩邊的指針,指向前prev後next的結點)對象
執行到LinkedList<Integer> list = new LinkedList<Integer>();在內存中是這樣的blog
咱們再看看add()方法內存
1 public boolean add(E e) { 2 linkLast(e); 3 return true; 4 } 5 6 /** 7 * Links e as last element.//將e連接爲最後一個元素 8 */ 9 void linkLast(E e) { 10 final Node<E> l = last; 11 final Node<E> newNode = new Node<>(l, e, null); 12 last = newNode; 13 if (l == null) 14 first = newNode; 15 else 16 l.next = newNode; 17 size++; 18 modCount++; 19 }
執行add(1)方法後,將開始last=null賦給了一個變量l,這時候new Node<>(l, e, null);就是new Node<>(null, 1, null),在棧裏建立了對象(Node結點)。
到了12行last = newNode;last就不是null了,是0x2012,也就指向了下一個結點
在日後面看if判斷,這是l是等於null的,就把first = newNode;first就不是null了,是0x2012(newCode),也就指向了上一個結點。由於只有一個結點,先後都是它本身。
繼續add,l=0x2012,因此new Node<>(l, e, null);就是new Node<>(0x2012, 2, null),因此新增的結點就指向了上一個0x2012。
而後再last=newNode,就是0x3012。它就不執行0x2012了。
這個時候if判斷,l已經不等空了,執行l.next=newNode。newNode是0x3012,l是0x2012,l.next就是0x2012這個結點的next屬性,也是個Node。
內存圖是這樣的:
最後再add