LinkedList原始碼分析

2021-08-11 10:32:18 字數 1480 閱讀 2936

linkedlist雖然和arraylist都實現了list介面,但兩者的底層資料結構截然不同。從類名可以看出,arraylist底層資料結構是陣列,而linkedlist底層資料結構是雙向鍊錶。兩者資料結構的優劣如下,arraylist按下標查詢元素速度快,但插入元素或者刪除元素效率低,因為都設計到元素的大量移動,而linkedlist插入或刪除元素速度較快,查詢中間元素效率較低,因為查詢元素需要從距離指定位置最近的鍊錶頭部或尾部開始遍歷(頭部距離指定位置近,就從頭部開始遍歷,反之,從尾部開始遍歷),直到遍歷到指定位置為止。

下面開始進入到linkedlist內部進行分析它的實現。首先看核心資料結構-雙向鍊錶,是通過內部類entry來定義的。

private

static

class entry

}

此內部類很簡單,總共三個屬性,element:存放真正資料;next:指向後繼的指標;previous:指向前驅的指標。linkedlist持有了此entry結構的頭元素header,所有的操作都通過header進行操作,另外還有乙個整型數值size來記錄元素個數。linkedlist屬性定義如下:

//傀儡節點,header的element是永遠為null的,第乙個元素其實是存在了header.next.element中,這個可以從getfirst()方法看出來,header也是不計算在size當中的。

private

transient entryheader = new entry(null, null, null);

private

transient

int size = 0;

//第乙個元素其實是存在了header.next.element中

public e getfirst()

//最後乙個元素就是存在header.previous.element中

public e getlast()

//add方法是在鍊錶的尾部新增元素,和addlast(e e)方法作用一樣

public

boolean

add(e e)

private entryaddbefore(e e, entryentry)
//獲取指定下標處的元素,比較指定的下標距離煉表頭近還是鍊錶尾近,從距離近的地方開始遍歷取值

public e get(int index)

private entryentry(int

index) else

return e;

}

總結下:主要通過linkedlist的幾個主要方法來分析了下此類,其他方法也都比較容易理解。linkedlist的使用場景:在中間插入或者移除元素比較多的場景下使用。如果經常需要按照下標獲取元素,則使用arraylist。

LinkedList 原始碼分析

linkedlist資料結構是 雙向鍊錶 先來講下單鏈表和雙向鍊錶 雙向鍊錶 單鏈表相對於雙向鍊錶來說,結構簡單。但有乙個缺點,即在單鏈表中只能通過乙個節點的引用訪問其後續節點,無法直接訪問其前驅節點,如果在單鏈表中想找到某個幾點的前驅節點,必須遍歷鍊錶,耗費時間。因此擴充套件了單鏈表,在單鏈表結構...

LinkedList原始碼分析

資料結構 linkedlist是雙向迴圈鍊錶 1.構造方法 constructs an empty list.構造乙個空的列表 public linkedlist private transient entryheader new entry null,null,null entry e eleme...

linkedlist原始碼分析

一.繼承體系 二.原始碼分析 新增鍊錶元素 獲取指定索引元素 nodenode int index return lastnode 插入元素頻繁使用node方法根據索引找到要插入元素的位置,同時get方法獲取元素也是用到此方法。刪除鍊錶元素 private void unlink nodex els...