Java集合之LinkedList原始碼解析

2021-07-24 05:43:46 字數 3671 閱讀 5295

linkedlist

非執行緒安全的可重複元素順序列表

繼承abstractsequentiallist;其父類為abstractlist

骨架實現,

該類要求子類必須重寫listiterator(int index)方法(abstract

list已提供骨架實現);

實現了cloneable,實現淺轉殖;

實現了序列化介面,並自定義了readobject、writeobject方法

實現了deque介面,提供了雙端佇列的相關方法,可以做為雙端佇列或棧使用

jdk1.6版本的linkedlist順序列表採用雙向迴圈鍊錶實現,存在固定的header煉表頭元素,下乙個為首元素,上乙個為末元素

jdk1.7版本的linkedlist順序列表採用雙向鍊錶實現,分別定義了first、last元素,以便進行正向及反向查詢

該資料結構,進行下標查詢操作時需要從首元素或末元素開始逐個查詢(演算法時間複雜度o(n));

插入、刪除到指定位置時,需要先進行位置查詢到指定位置元素,然後進行新增及位置鏈結設定操作(演算法時間複雜度o(n))

僅在較前位置插入刪除會較arraylist快,由於arraylist採用了陣列快速移動方法,在資料量大時比arraylist插入、刪除慢

重點方法:

1、資料結構及構造器

(1)元素定義

jdk1.6

private static class entry

}

jdk1.8(1.7將類名調整為node以便與map的entry區分,構造順序進行了調整)

private static class node

}

(2)首尾節點記錄及構造方法,與arraylist一樣,除了無參構造外也提供了拷貝構造器

jdk1.6,只定義空的header頭節點,上乙個是列表最後元素,下乙個是列表首個元素

private transient entryheader = new entry(null, null, null);//煉表頭

public linkedlist()

public linkedlist(collection<? extends e> c)

public boolean addall(collection<? extends e> c)

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

successor.previous = predecessor;//後置元素的previous設定為最後乙個陣列對應的新建元素

size += numnew;//增加列表長度

return true;

}

transient nodefirst;//首元素

transient nodelast;//末元素

public linkedlist()

public linkedlist(collection<? extends e> c)

(3)插入操作,刪除也類似

jdk1.6

public void addfirst(e e) 

public void addlast(e e)

private entryaddbefore(e e, entryentry)

jdk1.8

public void addfirst(e e) 

private void linkfirst(e e)

public void addlast(e e)

void linklast(e e)

void linkbefore(e e, nodesucc)

(4)查詢元素

jdk1.6

private entryentry(int index)  else 

return e;

}

jdk1.8

nodenode(int index)  else 

}

2、迭代器模式

linkedlist使用內部類實現了具體的fast-fail迭代器,並且保持iterator與listiterator建立相同的listitr迭代器。fail-fast 迭代器,這意味著它假設執行緒在集合內容中進行迭代時,集合不會更改它的內容。如果 fail-fast 迭代器檢測到在迭代過程中進行了更改操作(鍊錶結構的更改),那麼會丟擲 concurrentmodificationexception 。

jdk1.6版本(1.8與此類似,只是資料結構不同導致變化,不做列舉)

public listiteratorlistiterator(int index) 

private class listitr implements listiterator

}public boolean hasnext()

public e next()

public boolean hasprevious()

public e previous()

public int nextindex()

public int previousindex()

public void remove() catch (nosuchelementexception e)

if (next==lastreturned)

next = lastnext;//如果next被刪除,重置next

else

nextindex--;//否則減少index(此情況只有上一次呼叫next()發生,目前位置肯定在lastreturned後面)

lastreturned = header;//重置最近返回元素為煉表頭

expectedmodcount++;

}public void set(e e)

public void add(e e)

final void checkforcomodification()

}

3、幾個雙端佇列方法及區別

(1)addfirst/offerfirtst;addlast/offerlast,均為插入列表的首末元素,add方法沒有返回值,offer方法返回插入成功失敗

(2)removefirst/pollfirst;removelast/polllast,均為刪除列表的首末元素,並且都返回刪除元素資料,但空列表時remove拋異常,poll返回null

(3)getfirst/peekfirst;getlast/peeklast,均為取得列表的首末元素,並且都返回刪除元素資料,但空列表時get拋異常,peek返回null

(4)push呼叫的addfirst;pop呼叫的removefirst

4、實現雙端佇列特殊的反向迭代器

jdk1.6與jdk1.8一致

public iteratordescendingiterator() 

private class descendingiterator implements iterator

public e next()

public void remove()

}

深入Java集合系列之二 LinkedList

前言 linkedlist底層使用的雙端鍊錶,即每個節點既包含指向其後繼的引用也包括指向其前驅的引用,linkedlist實現了list介面,繼承了abstractsequentiallist類,在頻繁進行插入以及刪除的情況下效率較高。linkedlist使用較多的是add get和remove,原...

java集合類庫學習記錄 LinkedList

1.介紹 linkedlist是list 介面的鏈結列表實現。實現所有可選的列表操作,並且允許所有元素 包括null 擴充套件了abstractsequentiallist抽象類,實現了deque和queue介面。這些操作允許將鏈結列表用作堆疊 佇列和雙端佇列。2.abstractsequentia...

Java之集合總結

1 集合 自己補齊 collection 單列集合 list 有序,可重複 arraylist 底層資料結構是陣列,查詢快,增刪慢 執行緒不安全,效率高 vector 底層資料結構是陣列,查詢快,增刪慢 執行緒安全,效率低 linkedlist 底層資料結構是鍊錶,查詢慢,增刪快 執行緒不安全,效率...