相互關係
- LinkedList、ArrayList、Vector 都繼承自 AbstractList;都實現了 List 接口,主要包括 size(), isEmpty(), contains(Object), iterator(), toArray(), add(E), remove(), get(int), sort(), clear(), set(int, E), subList(int, int), listIterator() 等方法。
- LinkedList 實現了 Deque 接口(主要是對首尾元素的添加刪除方法), Vector 和 ArrayList 實現了 RandomAccess 接口。
- 它們都是泛型類,可以存放任意類型的對象。
public class LinkedList<E> extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public class Vector<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public class Stack<E> extends Vector<E>
AbstractCollection
-> AbstractList
-> AbstractSequentialList - > LinkedList
-> ArrayList
-> Vector -> Stack
實現原理和線程安全性
LinkedList
- LinkedList 可以看做爲一個雙向鏈表,所有的操作都可以認爲是一個雙向鏈表的操作,實現了 List 和 Deque 接口。LinkList 可以很方便地在鏈表頭或者鏈表尾插入數據,或者在指定結點前後插入數據,還提供了取走鏈表頭或鏈表尾的結點,或取走中間某個結點的方法。
- LinkedList 沒有同步方法,是線程不安全的。
- 如果多個線程同時訪問一個List,必須自己實現訪問同步。一種解決方法是在創建List時構造一個同步的List list = Collections.synchronizedList(new LinkedList(…));
- 成員變量:
transient int size = 0;
transient Node<E> first;
transient Node<E> last;
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
}
ArrayList
- ArrayList實現了可變大小的數組。它允許所有元素,包括null。
- ArrayList沒有同步,是線程不安全的。
- 成員變量:
transient Object[] elementData;
private int size;
- 擴容:
- ArrayList 的容量 capacity 可隨着不斷添加新元素而自動增加,正常情況下每次增加當前數組大小的一半。
- 擴容時拷貝舊數據生成一個 newCapacity 大小的新數組,然後將elementData指向新數組。
- 擴容時機:
- add元素前,先確保 catacity>=size+1。
- 當需要插入大量元素時,在插入前可以調用 ensureCapacity(int minCapacity) 方法來增加ArrayList的容量以提高插入效率, 參數 minCapacity 爲希望調整到的最小容量。
Vector
- Vector也是一個類似於ArrayList的可變長度的數組類型,它的內部也是使用數組來存放數據對象的。
- Vector與ArrayList唯一的區別是,Vector是線程安全的,即它的大部分方法都包含有關鍵字synchronized,因此,若對於單一線程的應用來說,最好使用ArrayList代替Vector,因爲這樣效率會快很多(類似的情況有StringBuffer與StringBuilder);而在多線程程序中,爲了保證數據的同步和一致性,可以使用Vector代替ArrayList實現同樣的功能。
- 成員變量:
protected Object[] elementData;
protected int elementCount;
protected int capacityIncrement;
Stack
- Stack繼承自Vector,實現一個後進先出的堆棧。Stack提供5個額外的方法使得 Vector得以被當作堆棧使用。基本的push和pop方法,還有peek方法得到棧頂的元素,empty方法測試堆棧是否爲空,search方法檢測一個元素在堆棧中的位置。Stack剛創建後是空棧。
總結
List |
實現原理 |
線程安全性 |
備註 |
LinkedList |
雙向鏈表 |
不安全 |
相對於ArrayList,插入或增加效率高,查詢效率低;使用數據頻繁出入的情況。 |
ArrayList |
數組 |
不安全 |
試用與數組變動不大,主要用來查詢的情況。 |
Vector |
數組 |
安全 |
|
Stake |
數組 |
安全 |
繼承自Vector,添加額外方法實現後進先出的堆棧 |