LinkedList 原始碼分析

2022-06-06 08:09:12 字數 2556 閱讀 7067

該類繼承自 abstractsequentiallist 這個是由於他是乙個順序的列表,所以說繼承的是乙個順序的 list

這個類實現的介面比較多,具體如下:

首先這個類是乙個 list 自然有 list 介面

然後由於這個類是實現了 deque 這個介面是雙端佇列的介面,所以說它是具有雙端佇列的特性的。後面我們會看到很多關於雙端佇列的方法。

然後就是兩個集合框架肯定會實現的兩個介面 cloneable, serializable 。

1. 屬性字段

transient int size = 0;

//指向鍊錶的頭指標和尾指標

transient nodefirst;

transient nodelast;

2. node 節點

node 節點是主要存放資料的地方這個節點資料結構也比較簡單就是乙個泛型加上前驅後繼指標。也就是乙個雙向鍊錶。

private static class node

}

ctor-2

addfirst

addlast

addall

addindexof

lastindexof

peek 獲取第乙個元素,是 null 就返回 null

peekfirst/last 獲取第乙個最後乙個元素

poll 刪除第乙個元素並返回 沒有返回 null

pollfirst/last

offer 呼叫了 add

offerfirst/last

push

popset

remove(noargs) == removefirst 繼承自 deque

remove(e e) 查詢刪除

read/writeobject 還是手動的序列化,原因一樣,直接序列化元素而沒有 pre/next

只有兩個構造方法。其中乙個是預設的空構造也就是生成乙個空的 linkedlist 另外乙個就是接受乙個 collection 介面。裡面呼叫了 putall 方法。

public linkedlist() 

public linkedlist(collection<? extends e> c)

這個方法就直接呼叫了linklastlinklast裡面就是直接把元素新增到元素的結尾。

public boolean add(e e) 

void linklast(e e)

這兩個方法同上還是呼叫了linkfirstlinklast所以說這幾個新增修改的方法基本都是靠底層的同樣的方法實現的。

public void addfirst(e e) 

public void addlast(e e)

該方法我們在構造方法中也看到了,在它裡面實現的時候和 arraylist 一樣是直接把集合轉成陣列,然後進行建立新的節點插入進來。

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

for (object o : a)

if (succ == null) else

size += numnew;

modcount++;

return true;

}

這個方法裡面採用 for 迴圈遍歷,遍歷的時候是從頭結點開始遍歷,只要找到那個元素立即返回,而不繼續進行下去。

public int indexof(object o) 

} else

}return -1;

}

這個方法和上面的方法實現的方式一樣的,但是注意這個方法的意思是找到最後乙個與之匹配的元素,他並不是從頭開始找,而是直接從尾節點開始遍歷。做法同理找到即停止。

peek方法的意思就是返回最頂端的元素,如果這個元素不存在,那麼直接返回null。之後還有peekfirst這類的就是返回第乙個的意思。底層呼叫的就是頭結點的屬性。這些方法其實在 collection 介面中是不存在的,主要就是因為他實現了 deque 所帶來的的新特性。

poll用來刪除頭結點並返回,如果不存在就返回null

剩下的兩個方法同理。

插入頭結點。

底層的方法就是 addfirst 和 removefirst

無參的呼叫 removefirst 有引數的就是去查詢然後刪除。

這裡同arraylist自己手動的進行了序列化。序列化的時候只是對 node 節點裡面的元素進行序列化,而前驅後繼直接省略,也是節約空間的想法。

好,其實在完全理解arraylist的基礎之上看這篇文章就比較好理解,裡面的操作更加簡單。只是注意一下兩者的區別,實現了deque帶來的不少新的方法。

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按下標查詢元素速度快,但插入元素或者刪除元素效率低,因為都設計...