LinkedList使用及原理

2022-05-20 14:52:41 字數 2782 閱讀 8455

前面介紹了arrylist的原理和使用方法,本篇來介紹list家族中另乙個重要成員——linkedlist。linkedlist和arraylist一樣是集合list的實現類,雖然較之arraylist,其使用場景並不多,但同樣有用到的時候,那麼接下來,我們來認識一下它。

通過idea生成linkedlist的繼承關係圖,可以清晰的看出linkedlist的繼承關係。如下圖

首先,我們先看一下linkedlist這個類的屬性。

transient

int size = 0;

/*** pointer to first node.

* invariant: (first == null && last == null) ||

* (first.prev == null && first.item != null)

*/transient nodefirst;

/*** pointer to last node.

* invariant: (first == null && last == null) ||

* (last.next == null && last.item != null)

*/transient nodelast;

private

static

class node

}

linkedlist類的主要屬性有size,first和last。其中,size標識節點的個數,first指向鍊錶的頭節點,last指向鍊錶的尾節點。再看一下節點的定義,也就是node類,可以看出,linkedlist其實就是乙個雙向鍊錶。

linkedlist的提供兩個建構函式。乙個無參建構函式,乙個引數未集合建構函式。

無參建構函式很簡單,只是建立了乙個linkedlist的物件。

public

linkedlist()

有參建構函式首先呼叫無參建構函式新建乙個物件,然後再呼叫addall將集合新增進去。

public linkedlist(collection extends e>c)
再來看一下addall方法,我將相關的方法都粘了過來,逐一進行分析public boolean addall(collection extends e>c)

return

addall(size, c);

}

public boolean addall(int index, collection extends e>c)

else

for(object o : a)

if (succ == null

) else

size +=numnew;

modcount++;

return

true;}

private

void checkpositionindex(int

index)

private boolean ispositionindex(int

index)

nodenode(int index)  else 

}

首先呼叫addall的過載方法,可以再某個位置新增節點,傳入size,此時size的值為0。首先呼叫 checkpositionindex(index)方法,然後將要得到要插入位置的前置節點和後置節點,最後插入元素,詳細看**注釋。

這裡只說一下插入和刪除,他們牽涉到引用的變動

linkedlist主要提供addfirstaddlastaddaddall等方法來實現元素的新增。下面我們一一來看:public

void

addfirst(e e)

private

void

linkfirst(e e)

add方法和addlast方法最後呼叫的都是乙個方法,總體思路一樣,只是牽涉到引用的指向。

public

boolean

add(e e)

public

void

addlast(e e)

void

linklast(e e)

看了這幾個新增,通過下面這個圖來看一下吧

這裡只說一下public e remove(int index)這個方法

public e remove(int

index)

e unlink(node

x)

else

if (next == null

) else

x.item = null

; size--;

modcount++;

return

element;

}

通過下面這張圖就可以清楚的標識引用的變動了

本篇對linkedlist的原理進行了分析,希望對大家有所幫助,接下來會對比一下arraylist和linkedlist,希望小夥伴們持續關注。

LinkedList底層原理

首先 linkedlist 是雙向列表。用於記錄集合的數量 transient intsize 0 集合的第一項 transient nodefirst 集合的最後一項 transient nodelast linkedlist類中有乙個內部私有類node,這個類就代表雙端鍊錶的節點node。這個類...

LinkedList的原理和方法介紹 使用

目錄 linkedlist底層是雙向鍊錶 變數 構造方法 public linkedlist public linkedlist collection c 常用方法,不討論最簡單的add和remove public void addfirst e e 在把元素新增在煉表頭 public void a...

ArrayList及LinkedList原始碼分析

jdk7的情況 建議在開發中使用帶引數的構造器 arraylist list new arraylist int capaity 這樣能夠減少擴容次數,從而提高效率。jdk8的情況 小總結jdk7中的arraylist中底層object陣列的建立類似於單例模式中的餓漢式,一呼叫建構函式就建立了乙個長...