集合 LinkedList原始碼解析

2021-10-02 06:07:40 字數 2659 閱讀 1878

在實際開發中,arraylist的使用頻率是最高的,因為多數情況下我們使用arraylist容器儲存資料,以便在後面做遍歷,或者做查詢操作,此時用arraylist確實是最恰當的。然而有些場景,我們可能會經常性的對容器裡的元素進行變更,那麼這個時候linkedlist就出來了,得益於它底層的鍊錶結構,在資料的增刪方面比arraylist更具有優勢。

煉表示意圖:

1.linkedlist特徵:

list有索引、有序、元素可重複。查詢慢,新增刪除快。

2.實現介面:

實現deque表示這是乙個支援元素在兩端進行插入和刪除操作的線性集合。addfirst/addlast/removefirst/removelast

實現cloneable,集合的淺拷貝。

3.成員變數:

//集合中元素的個數

transient int size = 0;

//鍊錶的頭節點

transient nodefirst;

//鍊錶的尾結點

transient nodelast;

private static class node

}

集合容量size,第乙個節點 first、最後乙個節點last,底層資料結構是雙向鍊錶。

first的特性(first == null && last == null) || (first.prev == null && first.item != null)。

last的特性(first == null && last == null) || (last.next == null && last.item != null)。

當集合初始化時,fist和last均為null;當集合中只有乙個元素時,first和last是同一物件。first和last節點會攜帶集合元素的。

資料結構:雙向鍊錶

4.構造方法:

public linkedlist() {}

public linkedlist(collection extends e> c) {}

5.元素查詢:

public e get(int index) 

nodenode(int index) else

}

由於鍊錶在記憶體中的不連續性,所以無法通過索引計算出位址值,元素的查詢都是從頭結點或者尾結點開始。這就導致了鍊錶的查詢比陣列要慢。

first頭結點的索引值為0,根據next的指向依次增加;tail節點的索引為size-1,根據prev的指向一次減少。

6.元素新增:

i+1表示要插入的位置,設s表示要插入的節點。p為i處節點,pn為i+1處節點。

插入步驟:

1.s的前驅指向p。

2.s的後繼指向pn。

3.pn的前驅指向s。

4.p的後繼指向s。

//新增元素方式1    

public boolean add(e e)

//新增元素方式2

public void add(int index, e element)

void linklast(e e)

void linkbefore(e e, nodesucc)

新增元素時,若直接呼叫add(e)方法,則直接將元素新增在最末;若呼叫add(e,index)表示在指定位置插入元素,此時index處的元素會進行後移。addfirst頭插法,addlast尾插法。

7.元素刪除:

i表示要刪除的位置,設p表示要插入的節點。pp為p的前驅,pn為p的後繼。

插入步驟:

1.pp的後繼指向pn。

2.pn的前驅指向pp。

//接觸x的引用,等待gc

x.item = null;

size--;

modcount++;

return element;

}8.元素修改:

public e set(int index, e element)

集合原始碼分析(二)LinkedList集合

1 鍊錶在記憶體中有什麼特點?鍊錶在記憶體中不是乙個連續的空間。靠前乙個記錄後乙個的位址值,後乙個記錄前乙個的位址值。2 鍊錶為什麼查詢慢,增刪快?查詢 先要判斷你要查的這個元素,是靠頭近還是靠尾近。如果是靠頭近,那麼從第乙個開始遍歷 如果靠尾近,那麼從最後乙個開始遍歷。例如,多個人手拉手,每個人使...

Java集合之LinkedList原始碼解析

linkedlist 非執行緒安全的可重複元素順序列表 繼承abstractsequentiallist 其父類為abstractlist 骨架實現,該類要求子類必須重寫listiterator int index 方法 abstract list已提供骨架實現 實現了cloneable,實現淺轉殖...

集合系列 LinkedList原始碼分析

本篇介紹的linkedlist是list介面的另一種實現,它的底層是基於雙向鍊錶實現的,因此它具有插入刪除快而查詢修改慢的特點,此外,通過對雙向鍊錶的操作還可以實現佇列和棧的功能。linkedlist的底層結構如下圖所示。f表示頭結點引用,l表示尾結點引用,鍊錶的每個結點都有三個元素,分別是前繼結點...