在實際開發中,arraylist的使用頻率是最高的,因為多數情況下我們使用arraylist容器儲存資料,以便在後面做遍歷,或者做查詢操作,此時用arraylist確實是最恰當的。然而有些場景,我們可能會經常性的對容器裡的元素進行變更,那麼這個時候linkedlist就出來了,得益於它底層的鍊錶結構,在資料的增刪方面比arraylist更具有優勢。
煉表示意圖:
1.linkedlist特徵:
list有索引、有序、元素可重複。查詢慢,新增刪除快。
2.實現介面:
實現deque表示這是乙個支援元素在兩端進行插入和刪除操作的線性集合。addfirst/addlast/removefirst/removelast
實現cloneable,集合的淺拷貝。
3.成員變數:
//集合中元素的個數
transient int size = 0;
//鍊錶的頭節點
transient nodefirst;
//鍊錶的尾結點
transient nodelast;
private static class node
}
集合容量size,第乙個節點 first、最後乙個節點last,底層資料結構是雙向鍊錶。
first的特性(first == null && last == null) || (first.prev == null && first.item != null)。
last的特性(first == null && last == null) || (last.next == null && last.item != null)。
當集合初始化時,fist和last均為null;當集合中只有乙個元素時,first和last是同一物件。first和last節點會攜帶集合元素的。
資料結構:雙向鍊錶
4.構造方法:
public linkedlist() {}
public linkedlist(collection extends e> c) {}
5.元素查詢:
public e get(int index)
nodenode(int index) else
}
由於鍊錶在記憶體中的不連續性,所以無法通過索引計算出位址值,元素的查詢都是從頭結點或者尾結點開始。這就導致了鍊錶的查詢比陣列要慢。
first頭結點的索引值為0,根據next的指向依次增加;tail節點的索引為size-1,根據prev的指向一次減少。
6.元素新增:
i+1表示要插入的位置,設s表示要插入的節點。p為i處節點,pn為i+1處節點。
插入步驟:
1.s的前驅指向p。
2.s的後繼指向pn。
3.pn的前驅指向s。
4.p的後繼指向s。
//新增元素方式1
public boolean add(e e)
//新增元素方式2
public void add(int index, e element)
void linklast(e e)
void linkbefore(e e, nodesucc)
新增元素時,若直接呼叫add(e)方法,則直接將元素新增在最末;若呼叫add(e,index)表示在指定位置插入元素,此時index處的元素會進行後移。addfirst頭插法,addlast尾插法。
7.元素刪除:
i表示要刪除的位置,設p表示要插入的節點。pp為p的前驅,pn為p的後繼。
插入步驟:
1.pp的後繼指向pn。
2.pn的前驅指向pp。
//接觸x的引用,等待gc
x.item = null;
size--;
modcount++;
return element;
}8.元素修改:
public e set(int index, e element)
集合原始碼分析(二)LinkedList集合
1 鍊錶在記憶體中有什麼特點?鍊錶在記憶體中不是乙個連續的空間。靠前乙個記錄後乙個的位址值,後乙個記錄前乙個的位址值。2 鍊錶為什麼查詢慢,增刪快?查詢 先要判斷你要查的這個元素,是靠頭近還是靠尾近。如果是靠頭近,那麼從第乙個開始遍歷 如果靠尾近,那麼從最後乙個開始遍歷。例如,多個人手拉手,每個人使...
Java集合之LinkedList原始碼解析
linkedlist 非執行緒安全的可重複元素順序列表 繼承abstractsequentiallist 其父類為abstractlist 骨架實現,該類要求子類必須重寫listiterator int index 方法 abstract list已提供骨架實現 實現了cloneable,實現淺轉殖...
集合系列 LinkedList原始碼分析
本篇介紹的linkedlist是list介面的另一種實現,它的底層是基於雙向鍊錶實現的,因此它具有插入刪除快而查詢修改慢的特點,此外,通過對雙向鍊錶的操作還可以實現佇列和棧的功能。linkedlist的底層結構如下圖所示。f表示頭結點引用,l表示尾結點引用,鍊錶的每個結點都有三個元素,分別是前繼結點...