1. 程式人生 > >Java之集合(五)LinkedList

Java之集合(五)LinkedList

有著 http 前言 htm 可能 遍歷 right ble 下標

  轉載請註明源出處:http://www.cnblogs.com/lighten/p/7298017.html

1.前言

  Java中另一個常見的list就是本章將要講的LinkedList。ArrayList的實現方式是數組,而LinkedList的實現方式是鏈表。兩者在性能上有著明顯的不同,之前講過ArrayList的特點就是易於查找,弱於插入,而LinkedList正好相反。這些都是和其數據結構有關,具體使用哪個,需要看操作數組的主要方向是查找還是插入了。

2.AbstractSequentialList

  LinkedList並沒有直接繼承自AbstractList,而是繼承自抽象父類AbstractSequentialList,其是繼承自AbstractList的。AbstractSequentialList出現的原因在於其較於AbstractList對於"random access"(隨機訪問)方面更有優勢。其只定義了如下方法:

技術分享

  這些都是針對於鏈表結構的相關方法,而具體實現不像ArrayList的那樣直接操作數組的下標(鏈表沒有下標)。這些實現都是通過listIterator這個抽象方法完成的:

技術分享

技術分享

  其它方法就不再一一列出,順帶一提的是,其返還的叠代器就是ListIterator。這些就是AbstractSequentialList的全部內容了。

3LinkedList

  LinkedList繼承自AbstractSequentialList,同時實現了List、Deque和Cloneable接口。其結構也一樣的簡單明了。數據結構如下:

技術分享

  一個元素個數,一個頭結點,一個尾結點。由於是鏈表,所以其是不需要擴容的,先看看Node的相關結構吧。

技術分享

  很簡單的結構,前一個結點的引用,下一個結點的引用和本結點的內容。這是一個雙向鏈表。

技術分享

  這是一個簡單的插入到最前的一個實現:獲取當前第一個元素,生成插入元素,替換成頭結點。如果當前第一個元素為null,尾結點自然也就是頭結點了,否者原頭結點持有插入在其前面的結點的引用。其它的操作也基本與此類似,不再進行敘述,最後會給出一個圖來看其操作。

  有意思的是LinkedList和ArrayList一樣並沒有使用父類的方法,而是重寫了一套。所以其並沒有使用叠代器完成get,remove等操作。

技術分享

  node方法做了一點小優化:

技術分享

  根據結點位置是在前半還是後半決定是順序遍歷還是逆序遍歷,這樣盡可能的減少遍歷次數。

  最後看看叠代器,其實也沒什麽可看的了:

技術分享

  定位到指定結點位置,然後對其進行操作罷了。逆序的叠代器實現就更簡單了:

技術分享

  最後值得一提的是,LinkedList並沒有像ArrayList一樣重寫了SubList方法,所以其使用的還是抽象父類AbstractList實現的方法。

4.示意圖

技術分享

  移除操作類似,這裏不再給出示意圖。

Java之集合(五)LinkedList