【JDk源碼解析之二】LinkedList源碼解析

1.LinkedList的繼承關係如圖,和ArrayList一樣都實現了List接口。但是ArrayList是基於動態數組的實現,LinkedList是基於鏈表的實現。



2.LinkedList是基於鏈表實現的,增加和刪除容易,查找相對費時間。首先來看LinkedList的Node節點定義,如圖所示。可以看到Node節點不僅有隻向下一個節點的引用,還有隻向前一個節點的引用,是雙向的。所以LinkedList是雙向鏈表。特別強調,不再是循環鏈表。


再來看LinkedList的構造方法,如下圖所示。transient關鍵字,表示被修飾的屬性不會被序列化。LinkedList有first和last屬性,分別只向鏈表的第一個和最後一個元素。


3.具體源碼分析

3.1  add方法

由於有first和last,所以可以在LinkedList的首尾增加節點,首先來看在末尾增加一個元素的方法,如下圖所示。add(E e)和addLast(E e)是一樣的,都是最終調用linkLast(E e)方法,實現在LinkedList的尾部增加元素。


那麼在首部增加元素是怎樣的呢,如圖所示。


最重要的是,它支持在指定的index增加元素。在查找index的元素的時候,用了一個簡單的優化操作,就是看這個index距離first近還是last近,然後在按照相應的方法去查。



3.2 remove方法

remove方法和add方法類似,都是能在收尾進行刪除,直接看源碼,沒有什麼特別的。



3.3 addAll()方法

按照index插入元素的時候,需要調用node(index),以此獲得index位置的元素,所以這種結構不適合隨機訪問和查找。


3.4 get方法

每次按照index獲取元素的時候,都要記得check 索引是否已經越界。



3.5 set方法

對於鏈表的操作,無非增刪改查,下面看看改是怎麼實現的。改也就是set方法



4. 總結

LinkedList 是基於鏈表實現的list,是一個雙向鏈表。有的博客說是雙向循環鏈表,這其實現在是不對的。在Jdk7裏面,已經不再是循環鏈表了,所以不要看着別人說雙向循環,就說雙向循環,我的代碼分析都是基於jdk7,jdk8的沒看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章