說明:本文基於jdk1.7原始碼
linkedlist 是乙個雙向鍊錶,它也可以被當作棧、佇列(queue)或雙端佇列(deque)進行操作。linkedlist隨機訪問效率低,但隨機插入和刪除效率高。
linkedlist是基於鍊錶實現的,鍊錶中節點定義如下。
privatestatic
class node
}
每個節點由prev指標,next指標,item元素組成。
//元素個數
transient
int size = 0;
//頭節點
transient nodefirst;
//尾節點
transient nodelast;
publiclinkedlist()
public linkedlist(collection<? extends e>c)
linkedlist基於index的操作需要先通過node(index)定位index處的節點,然後再進行相應的操作。
以add(int index,e element)為例:
/*** 在指定位置插入元素
*/public
void add(int
index, e element)
node
node(int
index)
else
}void linkbefore(e e, nodesucc)
node(int index)方法在定位index時,使用了二分查詢思想,只不過只是二分了一次。通過將index與size/2比較,可得知index在鍊錶的前半段還是後半段,然後在那半段中繼續使用for迴圈依次查詢。
定位到位置後,只需要將對應的鏈斷開,將新節點重新鏈結到鍊錶中就完成了插入。而相比arraylist,在插入時,需要進行元素的移位操作。所以我們常說鍊錶適合快速的插入和刪除操作,正是少了移動元素的過程,因此相比效率較高。
總結
linkedlist底層使用鍊錶實現。插入和移除操作速度快,隨機訪問速度慢。
1.為什麼linkedlist插入和刪除操作速度快?
與arraylist相比,linkedlist插入和刪除操作速度快是因為少了元素的移動過程,只需要將該斷開的鏈斷開,該連線的鏈鏈結上即可。
2.為什麼linkedlist隨機訪問速度慢?
隨機訪問速度慢是因為linkedlist不像arraylist有下標index可以直接定位元素,而是要先通過二分確定index在鍊錶前半段還是後半段,然後再在對應的那半段中通過for迴圈定位。
LinkedList 原始碼分析
linkedlist資料結構是 雙向鍊錶 先來講下單鏈表和雙向鍊錶 雙向鍊錶 單鏈表相對於雙向鍊錶來說,結構簡單。但有乙個缺點,即在單鏈表中只能通過乙個節點的引用訪問其後續節點,無法直接訪問其前驅節點,如果在單鏈表中想找到某個幾點的前驅節點,必須遍歷鍊錶,耗費時間。因此擴充套件了單鏈表,在單鏈表結構...
LinkedList原始碼分析
資料結構 linkedlist是雙向迴圈鍊錶 1.構造方法 constructs an empty list.構造乙個空的列表 public linkedlist private transient entryheader new entry null,null,null entry e eleme...
LinkedList原始碼分析
linkedlist雖然和arraylist都實現了list介面,但兩者的底層資料結構截然不同。從類名可以看出,arraylist底層資料結構是陣列,而linkedlist底層資料結構是雙向鍊錶。兩者資料結構的優劣如下,arraylist按下標查詢元素速度快,但插入元素或者刪除元素效率低,因為都設計...