java8 LinkedList 源碼解析

? ? LinkedList是另外一種常見的list實現類,底層基于鏈表實現,不僅實現了List接口,還是實現了Deque接口,所以說LinkedList也是一種隊列。LinkedList是雙向鏈表,它的插入刪除效率較高,但是查詢效率較低(雖然有一定的優化)。firstlast表示列表的首尾節點,容量大小用size表示。下面就具體講講LinkedList的源碼。

1.Node節點信息

? ? Node的構造方法已經使node節點插入了鏈表,但此時整個鏈表還不是雙向鏈表。還需要將node前驅的后繼(node.prev.next=node)、后繼的前驅(node.next.prev=node)指向node,如此,整個鏈表構成了雙向鏈表。

圖1 節點Node類

2.構造函數

? ? ? LinkedList有兩個構造函數。傳入Collection對象的構造函數調用了addAll(size, c)。

圖2 構造函數

? ? ? addAll(index, c)首先會檢查index和c,檢查通過后用succ保存后繼節點,然后再pred、succ之間插入c的元素并且不停的跟新pred節點,如果pred為空,表示是從首節點插入,所以需要讓first指向newNode;否則使pred的后繼指向newNode。所有元素插入到隊列后,如果succ為空,則last指向pred節點;否則關聯pred與succ,即使succ的前驅指向pred,succ的后繼執行pred。最后修改size和modCount。

圖3 addAll方法

3.重要方法

? ? ① linkFirst方法。此方法使構造一個新節點并使first指向新節點。先把first備份,在利用構造函數構造新的首節點。如果原來first為空,表示鏈表為空,則把last指向newNode;否則是原首節點的前驅執行newNode;最后修改size和monCount。

圖4 linkFirst方法

? ? ② linkLast方法。類似linkFirst方法,此方法構造一個新節點,并使last指向新節點。先用l備份last,在創建一個新的節點,并使last指向新節點。如果last為空,意味著原鏈表為空,需要把first指向新節點;否則使l的后繼指向新節點。

圖5 linkLast方法

? ? ③ linkBefore方法。此方法在succ節點之前插入一個新節點。這里有一個條件,那就是succ不能為空。先利用pred記錄原succ的前驅。在創建一個新節點。succ的前驅指向新節點,再根據pred是否為空判斷到底把first指向新節點還是把pred的后繼指向新節點。

圖6 linkBefore方法

? ? ④ unlinkFirst方法。此方法刪除首節點f。先用next保存f的后繼,在使f的引用指向空(f是首節點所以不用置空f的前驅),使next指向first。如果next為空,則鏈表現在沒有元素,所有last也為空,否則把next.prev也置空,使jvm回收原first的資源。

圖7 unlinkFirst方法

? ? ⑤ unlinkLast方法。刪除非空尾節點l。類似unlinkFirst方法。先保存前驅,在置空l,接著把前驅賦值給last。最后根據前驅是否為空判斷鏈表是否有元素,根據結果把first賦空或者把現在last的后繼賦空。

圖8 unlinkLast方法

? ? ⑥ unlink方法。此方法刪除節點x。主要使x的前驅和后繼直接關聯上即可。這里要說明的如果前驅為空,沒必要再次使x.prev = null。最后還要修改size和modCount。詳細過程請看代碼。

圖9 unlink方法

? ? ⑦ node方法。此方法得到指定index序號的元素節點。如果index小于0.5*size,從前往后遍歷尋找序號為index的節點;否則,從后向前遍歷尋找node。

圖10 node方法

? ? ⑧contains與indexOf方法。如同ArrayList,contains也是利用indexOf判斷元素是否存在。indexOf方法返回元素第一次出現的位置,如果不存在則返回-1.

圖11 contains&indexOf方法

? ? LinkedList剩下的方法(包括queue接口的方法)主要就是利用size、first、last以及上訴提到的幾個方法實現。很簡潔。

圖12 getFirst&getLast方法
圖13 removeFirst&removeLast方法
圖14 addFirst&addLast方法
圖15 add&remove方法

? ? clear方法清空元素。

圖16 清空元素
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容