LinkedList原始碼分析

2021-09-13 21:26:36 字數 2718 閱讀 5782

1. 概述

通過類名可以想象到, 該類的結構是乙個鍊錶結構.

但是它是乙個類似於陣列的鍊錶, 意思就是普通的新增操作與陣列類似, 將新元素新增到鍊錶的尾端. 並支援通過下標來進行訪問.

它實現了deque介面, 提供了棧和佇列的操作, 也就是該類的主要功能吧.

對於元素的增刪改比arraylist強; 對於元素的查詢不如arraylist.

2. 建構函式

它提供了兩個建構函式, 比arraylist少乙個構造方法那就是沒有提供帶有初始化容量的構造方法, 也是與該類的儲存結構有關.

因為是鍊錶結構, 所以不會有擴容操作, arraylist的初始化容量是為了避免不必要的擴容操作.

2-1. 無參建構函式

* constructs an empty list.

public linkedlist() else {

nodex = last;

for (int i = size - 1; i index; i--)

x = x.prev;

return x;

下面我們看一下getfirst()和getlast()的原始碼, 其它方法的原始碼類似, 就是找到節點返回節點值.

* returns the first element in this list.

* @return the first element in this list

* @throws nosuchelementexception if this list is empty

public e getfirst() {

// 獲取頭結點

final nodef = first;

if (f == null)

throw new nosuchelementexception();

// 返回頭結點的值

return f.item;

* returns the last element in this list.

* @return the last element in this list

* @throws nosuchelementexception if this list is empty

public e getlast() {

// 獲取尾節點

final nodel = last;

if (l == null)

throw new nosuchelementexception();

// 獲取尾節點的值

return l.item;

4-2. 新增

新增的方法有:

可以發現, 最終的方法落實到了linkfirst(e)和linklast(e)兩個方法.

原始碼:* links e as first element.

private void linkfirst(e e) {

// 獲取鍊錶的頭節點

final nodef = first;

// 建立乙個新節點

final nodenewnode = new node(null, e, f);

// 使頭結點為新節點

first = newnode;

if (f == null)

// 如果原先的頭結點為null, 說明鍊錶為空鍊錶, 給尾節點也為該新節點

last = newnode;

// 否則頭結點的prev指向新節點

else

f.prev = newnode;

// 改變元素數量的大小

size++;

// 鍊錶結構的改變次數

modcount++;

* links e as last element.

void linklast(e e) {

final nodel = last;

final nodenewnode = new node(l, e, null);

last = newnode;

if (l == null)

first = newnode;

else

l.next = newnode;

size++;

modcount++;

4-3. 刪除

刪除操作就會涉及到節點之間引用關係的改變.

比如:a - b - c = a - c

先把b的prev的next指向b的next, 再把b的next的prev指向b的prev, 然後把b置為null.

至於其它的刪除方法, 也與之類似, 改變節點引用, 該節點置為null, size–, modcount–.

4-4. 修改

修改操作幾乎用不到, 也是使用了list介面的set(int, e)方法.

很簡單, 找到具體的元素進行修改即可.

public e set(int index, e element) {

checkelementindex(index);

nodex = node(index);

e oldval = x.item;

x.item = element;

return oldval;

5. 總結

基於鍊錶結構的儲存方式, 隨機訪問效能差, 元素的增刪效能比較好.

沒有擴容操作, 同等元素的情況下, 占用記憶體比arraylist多, 因為還要儲存節點之間的引用.

可以作為棧或者佇列使用.

不要因為知識簡單就忽略, 不積跬步無以至千里.

LinkedList 原始碼分析

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

LinkedList原始碼分析

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

LinkedList原始碼分析

linkedlist雖然和arraylist都實現了list介面,但兩者的底層資料結構截然不同。從類名可以看出,arraylist底層資料結構是陣列,而linkedlist底層資料結構是雙向鍊錶。兩者資料結構的優劣如下,arraylist按下標查詢元素速度快,但插入元素或者刪除元素效率低,因為都設計...