LinkedList 與 ArrayList的思考

首先看一下 LinkedList ArrayList 的繼承關係。

public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable

      

public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Queue<E>, Cloneable, Serializable

<o:p> </o:p>

兩者都實現 List 接口,前者實現 RandomAccess 接口,後者實現 Queue 接口。

<o:p> </o:p>

ArrayList<o:p></o:p>

ArrayList 其實是包裝了一個數組 Object[] ,當實例化一個 ArrayList 時,一個數組也被實例化,當向 ArrayList 中添加對象是,數組的大小也相應的改變。這樣就帶來以下有缺點:

快速隨即訪問 你可以隨即訪問每個元素而不用考慮性能問題,通過調用 get(i) 方法來訪問下標爲 i 的數組元素。

向其中添加對象速度慢 當你創建數組是並不能確定其容量,所以當改變這個數組時就必須在內存中做很多事情。

操作其中對象的速度慢 當你要想數組中任意兩個元素中間添加對象時,數組需要移動所有後面的對象。

<o:p> </o:p>

LinkedList<o:p></o:p>

LinkedList 是通過節點直接彼此連接 來實現的。每一個節點都包含前一個節點的引用,後一個節點的引用和節點存儲的值。當一個新節點插入時,只需要修改其中保持先後關係的節點的引用即可,當刪除記錄時也一樣。這樣就帶來以下有缺點:

操作其中對象的速度快 只需要改變連接,新的節點可以在內存中的任何地方

不能隨即訪問 雖然存在 get() 方法,但是這個方法是通過遍歷接點來定位的所以速度慢。

<o:p> </o:p>

一些結論: <o:p></o:p>

當一些被定義好的數據需要放到與數組對應的 List 中, ArrayList 是很好的選擇,因爲它可以動態變化,但是不要在整個應用程序用頻繁的使用。當你要很方便的操作其中的數據而不用隨即訪問時 LinkList 是很好的選擇。如果你要頻繁隨即訪問建議使用數組。

另外一個我沒有提到的是關於 Queue LinkedList 的實現使其具有很好的可擴展性,可以方便的在開始和結尾添加刪除節點。所以 LinkedList 很適合用來實現 Queue Stack ,儘管在 Java5 種已經有了一個 Stack 的實現。

<o:p> </o:p>

<o:p> </o:p>

以上是原文中的觀點,但是在回覆中也有人反對:

LinkedList 有以下缺陷:

對象分配 - 每添加一項就分配一個對象

回收垃圾 - 對象分配的結果

隨即訪問慢 - 設計上的原因

添加刪除慢 - 因爲首先要找到位置

應該使用 LinkedList 的情況非常少。大多數的建議使使用 LinkedList 是錯誤的。 <o:p></o:p>

JDK Stack 就是用數組來實現的。

在多數時間裏你並不是向 List 中間添加數據,而是向在結尾添加,這樣的操作 ArrayList 表現的很好。

LinkedList 在實現 Queue 時很有用。

<o:p> </o:p>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章