首先看一下 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>