1. 程式人生 > 實用技巧 >Java集合包(四)——List實現類之LinkedList

Java集合包(四)——List實現類之LinkedList

一:LinkedList特徵

  1、LinkedList底層是一個雙向連結串列,可以被當做堆疊、佇列、雙端佇列 來使用。

    雙向連結串列,又稱為“雙向迴圈連結串列”,每個資料結點中都有兩個引用,分別指向直接後繼和直接前驅節點,可以理解為它是一個“首尾相接”的環形連結串列。

    從雙向連結串列中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點,從而可以從任意一個結點開始往後或者往前遍歷完整個連結串列。

  2、LinkedList的操作不是執行緒安全的,建議在單執行緒環境下使用。多執行緒中可以選擇JUC併發包中的LinkedBlockingDeque。

  3、因為底層是雙向連結串列,那麼它的順序訪問會[從表頭開始迭代訪問]非常高效,而隨機訪問[只查詢某具體節點]效率比較低。

二:LinkedList繼承與實現關係

  

  1、繼承層次

java.lang.Object
   ↳     java.util.AbstractCollection<E>
         ↳     java.util.AbstractList<E>
               ↳     java.util.AbstractSequentialList<E>
                     ↳     java.util.LinkedList
<E>

  2、類定義與實現

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable {}

  1)LinkedList 繼承於AbstractSequentialList,AbstractSequentialList實現了get(int index)、set(int index, E element)、add(int index, E element) 和 remove(int index)等方法,支援隨機訪問List。


  2)LinkedList實現 了 List介面,因此具備了 佇列操作的方法。
  3)LinkedList實現 了 Deque介面,因此具備了 雙端佇列操作方法。
  4)LinkedList實現了Cloneable介面,即重寫 clone(),支援克隆。
  5)LinkedList實現了java.io.Serializable介面,支援序列化。

三:LinkedList原理

  LinkedList的本質是雙向連結串列,包含兩個重要的成員變數:header和size。
  1)header是雙向連結串列節點類Entry的例項,LinkedList中只需要存放表頭節點即可,表頭header不包含資料,只存放前驅節點和後繼節點的引用,其中:表頭的前驅節點就是雙向連結串列的最後一個元素節點,表頭的後繼節點就是雙向連結串列的第一個元素節點。

    Entry節點類中包含三個重要的成員變數: previous, next, element。previous是該節點的上一個節點,next是該節點的下一個節點,element是該節點所包含的值。


  2)size是LinkedList例項中雙向連結串列中節點的個數。

四:LinkedList關鍵方法

  1、如何實現在雙向連結串列中用索引下標進行“隨機訪問”查詢?

  通過一個計數索引值來實現:當我們呼叫get(int location)等用索引下標進行查詢時,首先會比較“location”和“size/2”[即雙向連結串列長度的1/2]的大小:

  若前者大,則從連結串列頭開始往後查詢,直到location位置;否則,從連結串列末尾開始先前查詢,直到location位置。

  

  2、