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