LinkedList原始碼分析

2022-03-23 09:22:54 字數 1357 閱讀 3034

說明:本文基於jdk1.7原始碼

linkedlist 是乙個雙向鍊錶,它也可以被當作棧、佇列(queue)或雙端佇列(deque)進行操作。linkedlist隨機訪問效率低,但隨機插入和刪除效率高。

linkedlist是基於鍊錶實現的,鍊錶中節點定義如下。

private

static

class node

}

每個節點由prev指標,next指標,item元素組成。

//

元素個數

transient

int size = 0;

//頭節點

transient nodefirst;

//尾節點

transient nodelast;

public

linkedlist()

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按下標查詢元素速度快,但插入元素或者刪除元素效率低,因為都設計...