LinkedList原始碼剖析

2021-10-02 23:39:22 字數 2402 閱讀 2821

我們知道,arraylist內部是陣列,元素在記憶體中是連續存放的,但linkedlist不是。

linkedlist直譯就是鍊錶確切的說,它的內部實現就是雙向鍊錶,每個元素在記憶體都是單獨存放的,元素之間通過連線一起

為了表示鏈結關係,需要乙個節點的概念

節點包括實際的元素,但同時有兩個連線,分別指向前面乙個節點(前驅)和後乙個節點(後繼)。

節點是乙個內部類,具體定義如下:

private

static

class

node

}

linkedlist內部組成就是如下三個例項變數:

//linkedlist的所有public方法內部操作都是這三個例項變數

transient

int size =0;

//表示鍊錶長度,預設為0

transient node

first;

//指向頭節點

transient node

last;

//指向尾結點

linkedlist的所有public方法操作都是這三個例項變數

public

boolean

add(e e)

void

linklast

(e e)

可以看出,與arraylist不同,linkedlist的記憶體是按需分配,不需要預先分配多餘記憶體,新增元素只需要分配新元素的空間,然後調節幾個連線即可

//根據索引訪問元素get(index)

public e get

(int index)

node

node

(int index)

else

}

**很簡單,從頭節點順著連線往後找,如果要找的是null,則找到第乙個item為null的節點,否則使用equals方法進行比較

public intf indexof

(object o)

}else

}return-1

;}

node

node

(int index)

else

}

public

void

add(

int index, e element)

void

linklast

(e e)

void

linkbefore

(e e, node

succ)

刪除x節點,基本思想就是讓x的前驅和後繼直接連線起來,next是x的後繼,prev是x的前驅

public e remove

(int index)

//刪除x節點,基本思想就是讓x的前驅和後繼直接連線起來,next是x的後繼,prev是x的前驅

e unlink

(node

x)else

if(next == null)

else

x.item = null;

size--

; modcount++

;//修改次數+1

return element;

}

用法上,linkedlist是乙個list,但也實現了deque介面,可以作為佇列雙端對哦咧使用。

實現原理上,linkedlist內部是乙個雙向鍊錶,並維護了長度,頭結點,尾結點,這決定了他有如下特點:

原始碼剖析 Hashtable 原始碼剖析

hashtable同樣是基於雜湊表實現的,同樣每個元素都是key value對,其內部也是通過單鏈表解決衝突問題,容量不足 超過了閾值 時,同樣會自動增長。hashtable也是jdk1.0引入的類,是執行緒安全的,能用於多執行緒環境中。hashtable同樣實現了serializable介面,它支...

LinkedList 原始碼分析

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

LinkedList原始碼分析

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