LinkedList相關知識及底層鍊錶實現原理

2021-10-09 03:55:40 字數 2580 閱讀 6524

1)linkedlist集合實現了list介面,儲存元素特點是:有序且可重複,並且集合元素都有下標,從0開始以1遞增。

2)linkedlist底層是以鍊錶為這種資料結構來儲存資料

3)linkedlist集合儲存元素優缺點:

優點:由於底層是以鍊錶為資料結構,所以在增刪方面速度很快,也很方便

缺點:查詢資料速度較慢。

所以在選擇arraylist集合和linkedlist集合時,需要頻繁對資料進行增刪的話,適合使用linkedlist集合;

在需要對資料進行大量的查詢時,選擇arraylist集合。

4)linkedlist沒有初始化容量,也沒有自動擴容機制。

1、linkedlist原始碼中的節點**,以及頭節點、尾節點和儲存元素變數

1).首先,linkedlist底層是雙向鍊錶,雙向鍊錶是由乙個乙個節點單元連線在一起形成的,每乙個節點中包含3個組成部分,上乙個節點的記憶體位址、儲存的資料、下乙個節點的記憶體位址。如下所示:

node<>類是linkedlist中的靜態內部類,表示節點物件,其中item用於儲存資料,next儲存下乙個節點的記憶體位址,prev儲存上乙個節點的記憶體位址。

private

static

class

node

}

2).鍊錶資料結構都有頭節點和尾節點,並且雙向鍊錶中,頭節點中儲存的上乙個節點記憶體位址為null,尾節點中儲存的下乙個節點記憶體位址也為null,在linkedlist中頭、尾節點定義如下:

/**

* pointer to first node.

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

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

*/transient node

first;

//頭節點

/** * pointer to last node.

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

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

*/transient node

last;

//尾節點

3).linkedlist的存入的元素數量用變數size表示:

transient

int size =

0;

2、接下來看看linkedlist底層是如何實現的。

1).首先我們向linkedlist集合中新增元素的時候會呼叫add()方法,方法原始碼如下:

public

boolean

add(e e)

可以看出add()方法又呼叫了linkedlist的另外乙個方法:linkedlast(),方法**如下:

void

linklast

(e e)

2).linklast()方法表示向linkedlist集合的末尾新增元素,接下來對其進行分析:

(1)首先定義乙個中間節點變數l來儲存末尾節點的記憶體位址(後面會用到,所以定義乙個中間節點變數)

(2)此處使用靜態內部類的構造方法:

node

(node

prev, e element, node

next)

將節點l,以及我們傳入集合的元素e,和null作為引數傳入構造乙個節點物件,此處構造的節點物件newnode就是在鍊錶末尾新增的乙個節點,所以此處的prev儲存的記憶體位址也就是本來的末尾節點last也就是剛剛定義的中間節點變數l的記憶體位址(由於原本集合中沒有元素,所以last節點記憶體位址為null),e就是儲存的資料,由於此節點新增在末尾所以就成為了尾節點,所以儲存下乙個節點的next的記憶體位址也就為null

last = newnode;

//將節點newnode定義為尾節點

if

(l == null)

first = newnode;

//定義為頭節點

else

l.next = newnode;

(4)、在新增完節點之後,也就表示傳入的元素存入了集合中所以,集合中的元素數量就要增加1個:

size++

;//集合中儲存的元素數量+1

modcount++

;//對集合結構修改次數+1

ArrayList及LinkedList原始碼分析

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

pragma once及相關知識

pragma once 這是乙個比較常用的指令,只要在標頭檔案的最開始加入這條指令就能夠保證標頭檔案被編譯一次 pragma once用來防止某個標頭檔案被多次include,ifndef,define,endif用來防止某個巨集被多次定義。pragma once是編譯相關,就是說這個編譯系統上能用...

LinkedList使用及原理

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