我們知道,為了表示鏈結關係,需要乙個arraylist
內部是陣列,元素在記憶體中是連續存放的,但linkedlist
不是。
linkedlist
直譯就是鍊錶
,確切的說,它的內部實現就是雙向鍊錶
,每個元素在記憶體都是單獨存放的,元素之間通過連線一起
節點
的概念
節點包括實際的元素,但同時有兩個連線,分別指向前面乙個節點(前驅)和後乙個節點(後繼)。
節點是乙個內部類,具體定義如下:
private
static
class
node
}
linkedlist
內部組成就是如下三個例項變數:
//linkedlist的所有public方法內部操作都是這三個例項變數
transient
int size =0;
//表示鍊錶長度,預設為0
transient node
first;
//指向頭節點
transient node
last;
//指向尾結點
linkedlist
的所有public
方法操作都是這三個例項變數
public
boolean
add(e e)
void
linklast
(e e)
可以看出,與arraylist
不同,linkedlist
的記憶體是按需分配,不需要預先分配多餘記憶體,新增元素只需要分配新元素的空間,然後調節幾個連線即可
//根據索引訪問元素get(index)
public e get
(int index)
node
node
(int index)
else
}
**很簡單,從頭節點順著連線往後找,如果要找的是null,則找到第乙個item
為null的節點,否則使用equals
方法進行比較
public intf indexof
(object o)
}else
}return-1
;}
node
node
(int index)
else
}
public
void
add(
int index, e element)
void
linklast
(e e)
void
linkbefore
(e e, node
succ)
刪除x節點,基本思想就是讓x的前驅和後繼直接連線起來,next是x的後繼,prev是x的前驅
public e remove
(int index)
//刪除x節點,基本思想就是讓x的前驅和後繼直接連線起來,next是x的後繼,prev是x的前驅
e unlink
(node
x)else
if(next == null)
else
x.item = null;
size--
; modcount++
;//修改次數+1
return element;
}
用法上,linkedlist
是乙個list
,但也實現了deque
介面,可以作為佇列
,棧
和雙端對哦咧
使用。實現原理上,
linkedlist
內部是乙個雙向鍊錶,並維護了長度
,頭結點
,尾結點
,這決定了他有如下特點:
原始碼剖析 Hashtable 原始碼剖析
hashtable同樣是基於雜湊表實現的,同樣每個元素都是key value對,其內部也是通過單鏈表解決衝突問題,容量不足 超過了閾值 時,同樣會自動增長。hashtable也是jdk1.0引入的類,是執行緒安全的,能用於多執行緒環境中。hashtable同樣實現了serializable介面,它支...
LinkedList 原始碼分析
linkedlist資料結構是 雙向鍊錶 先來講下單鏈表和雙向鍊錶 雙向鍊錶 單鏈表相對於雙向鍊錶來說,結構簡單。但有乙個缺點,即在單鏈表中只能通過乙個節點的引用訪問其後續節點,無法直接訪問其前驅節點,如果在單鏈表中想找到某個幾點的前驅節點,必須遍歷鍊錶,耗費時間。因此擴充套件了單鏈表,在單鏈表結構...
LinkedList原始碼分析
資料結構 linkedlist是雙向迴圈鍊錶 1.構造方法 constructs an empty list.構造乙個空的列表 public linkedlist private transient entryheader new entry null,null,null entry e eleme...