1. 程式人生 > >總結:ArrayList和LinkedList的分析與區別

總結:ArrayList和LinkedList的分析與區別

類 ArrayList< E >

【所屬包】:java.util
【父類結構】:
java.lang.Objectjava.util.AbstractCollection
java.util.AbstractList
java.util.ArrayList
【原始碼展示】

* <p>This class is a member of the
* <a href="{@docRoot}/../technotes/guides/collections/index.html">
* Java Collections Framework</a>.
*
* @author  Josh Bloch
* @author  Neal Gafter
* @see     Collection
* @see     List
* @see     LinkedList
* @see     Vector
* @since   1.2
*/

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
……
}

繼承:AbstractList
實現:List, RandomAccess, Cloneable, java.io.Serializable
相關構造方法說明
a.ArrayList()構造一個初始容量為 10 的空列表。
b.ArrayList(int initialCapacity)構造一個具有指定初始容量initialCapacity的空列表。
c.ArrayList(Collection<? extends E> c)構造一個包含指定 collection 的元素的列表,這些元素是按照該 collection 的迭代器返回它們的順序排列的。
ArrayList是List介面大小可變陣列的實現,允許Null值

類 LinkedList < E >

**

【所屬包】:java.util
【父類結構】:
--------java.lang.Objectjava.util.AbstractCollection
-----------java.util.AbstractList
-------------java.util.AbstractSequentialList
---------------java.util.LinkedList

【原始碼展示】

* @author  Josh Bloch
* @see     List
* @see     ArrayList
* @since 1.2
* @param <E> the type of elements held in this collection
*/

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
……
}
說明
繼承:AbstractSequentialList實現:List, Deque, Cloneable, java.io.Serializable
構造方法說明:LinkedList()構造一個空列表
構造方法說明:LinkedList(Collection<? extends E> c)構造一個包含指定 collection 中的元素的列表,這些元素按其 collection 的迭代器返回的順序排列。
LinkedList是List介面連結列表的實現,允許包含Null,並且提供了獲取、刪除、新增元素等統一命名的方法,所以LinkedList可以被用作“堆疊”、“佇列”、“雙向列表”
此類是 Java Collections Framework 的成員此類不是同步的

ArrayList和LinkedList的區別:

(1)二者都是List介面的實現,不同的是ArrayList是List介面一個有序的大小可變得陣列集合,LikedList是雙向連結串列的實現。
(2)二者都可以對儲存在其中的元素進行增刪改查, ArrayList儲存的是一個有序的陣列集合,在其開頭和結尾做增刪改操作效率是一樣,但是對其列表中間的元素要做增刪操作的話效率就會相對較慢,因為你修改的這個元素可能影響到它後面所有元素的下標值。但是ArrayList它的查詢效率是比較好的,因為它是一個有序的列表集合,可以根據對應的下標來獲取。 LinkedList是一個雙向連結串列,是一個連結串列結構,連結串列結構中每一個元素都記錄了對應下一個節點的指標,所以連結串列中元素的修改只跟它對應的前一個元素和後一個元素有關係,因此如果對LinkedList中元素做增刪改操作效率就會比較好。但是要檢索連結串列中的元素效率就會比較慢。
(3)ArrayList是一個動態陣列,一般初始化的時候都會指定這個容器的空間大小,如果有空間浪費的話,也只是列表尾部預留的沒有用的部分。LinkedList是一個雙向連結串列,連結串列中的每一個元素都有一塊自己的資料域同時還要記錄下一節點的指標域,就是說每一個元素都要消耗相當的空間。所以LinkedList的記憶體開銷要比ArrayList的大。
(4)二者都不是同步的(都不是執行緒安全的)

注意:
Vector和ArrayList相似都是List介面實現的動態陣列,不同的是Vector是執行緒安全的,所以效率上要比ArrayList慢一些。
預設初始容量都是10

連結串列
連結串列由一系列結點(連結串列中每一個元素稱為一個結點)組成,這個結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域
使用連結串列結構可以克服陣列連結串列需要預選知道資料大小的缺點, 連結串列結構可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理。
但是同時也正是因為連結串列增加了結點儲存的下一個結點的指標域,所以記憶體空間開銷比較大,(比較耗費記憶體空間)