Java之集合(五)LinkedList
轉載請註明源出處: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