終於迎來了 LinkedList 類,實現的接口就有點多了 Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E>。LinkedList是一個實現了List接口和Deque接口的雙端鏈表,有關索引的操做可能從鏈表頭開始遍歷到鏈表尾部,也可能從尾部遍歷到鏈表頭部,這取決於看索引更靠近哪一端。java
下面這張圖是從(https://blog.csdn.net/qq_19431333/article/details/54572876)複製來的安全
請注意,此實現不是線程安全的。若是多個線程同時訪問連接列表,而且至少一個線程在結構上修改列表,則通常在外部用synchronized修飾。若是想使LinkedList變成線程安全的,可使用以下方式:微信
List list = Collections.synchronizedList(new LinkedList(...));學習
該類有兩個構造方法,其中有參數的那個接口接受 Collection<? extends E> 類型的.net
這個構造方法能夠看看的 ,其實實現調用的是 addAll(int index, Collection<? extends E> c) 方法, LinkedList類的有兩個重要的transient Node<E> first 和 transient Node<E> last 字段, Object[] a = c.toArray(); 先將c轉化爲 Object[],後續使用for循環遍歷,而後就有一種寫指針的感受了,當初學習c語言寫列表的感受,不過在java裏面用了Node這個類來處理。 其實Node這個靜態內部類的實現也比較簡單,可是java實現鏈表結構的關鍵,至關於當前對象,下一個指針,前一個指針。 線程
由於實現了不少接口,而後在linkedList裏面擁有不少方法,主要看看列表比較獨有的吧,好比下面的在表頭和表尾插入數據,先初始化一個Node<E> ,而後建立一個newNode,而後表頭指向newNode,其中linkBefore,unlinkFirst,unlinkLast,unlink的實現也是相似的。3d
若是看懂了上面的方法,那麼getfirst和getLast就很簡單了,就是把表頭和表尾返回一下指針
那麼看remove表頭和表尾的方法也是很簡單的,其中調用的是unlink開頭的方法,好比unlinkFirst,unlinkLast。對象
可是若是你remove的是一個 object,那麼須要遍歷了,不過這裏找到一個相等的值,那麼就return啦。blog
在clear方法中處理起來比較簡單,就是把數據清楚掉,其中是幫助 GC回收各個節點
咱們看看查詢某個節點的方法,這邊將 size 右移一位,判斷index離哪一端比較近,而後遍歷到相應節點返回,由於是鏈表結構,因此須要一個遍歷,時間複雜度仍是有的。
這邊又有 peek 和 poll的方法,這些應該是隊列裏的吧,感受有些方法有重複的。
來看看序列化接口實現的兩個方法writeObject和readObject,使用s.defaultReadObject(),其中readObject後面會有一個linkLast方法
智商有限,時間倉促,就先寫到這裏吧 !
有什麼討論的內容,能夠加我微信公衆號: