List所使用的標記接口實現,表明他們支持快速隨機訪問(通常持續時間)。這個接口的主要目的是允許通用算法來改變他們的行爲時提供良好的性能應用於隨機或順序訪問列表。
最好的算法處理隨機訪問列表(如ArrayList)時能產生二次行爲適用於順序存取列表(如LinkedList)。鼓勵通用算法列表檢查給定的列表是一個instanceof這個接口是否申請前一種算法,將提供糟糕的表現如果應用到連續的訪問列表,並在必要時改變他們的行爲以保證可接受的性能。
認識到隨機的區別和順序存取通常是模糊的。例如,一些List實現提供了漸近線性訪問時間,如果他們得到巨大,但在實踐中不斷的訪問時間。這樣一個List實現通常實現這個接口。
已所知的實現類:ArrayList、Vector、AttributeList、CopyOnWriteArrayList、RoleList、RoleUnresolvedList、
ArrayList:是可調整大小的數組且實現List接口的類,也稱爲動態數組。transient Object[] elementData內部存儲不可序列化的對象數組。實現所有可選列表操作,並允許所有元素,包括null。此類還提供了一些方法來操作內部用於存儲列表的數組的大小。 (這個類大致相當於Vector,除了它是不同步的)。它包含的方法有size,isEmpty,get,set,iterator和listIterator操作以恆定時間運行。add 操作以分攤的常量時間運行,即添加n個元素需要O(n)時間。所有其他操作都以線性時間運行(粗略地說)。與LinkedList實現相比,常數因子較低。隨着元素添加到ArrayList,其容量會自動增加。除了添加元素具有恆定的攤銷時間成本這一事實之外,未指定增長策略的詳細信息。在使用ensureCapacity操作添加大量元素之前,應用程序可以增加ArrayList實例的容量。這可能會減少增量重新分配的數量。
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0)
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
Vector:是現了一個可增長的對象數組。像數組一樣,它包含可以使用整數索引訪問的組件。同步方法線程安全,
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0)
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
Stack:繼承Vector。Stack類表示對象的後進先出(LIFO)堆棧。它使用五個操作擴展了Vector類,這些操作允許將向量視爲堆棧。 提供通常的推送和彈出操作,以及查看堆棧頂部項目的方法,測試堆棧是否爲空的方法,以及在堆棧中搜索項目並發現距離頂部有多遠的方法。首次創建堆棧時,它不包含任何項目。Deque接口及其實現提供了更完整和一致的LIFO堆棧操作集,應優先使用此類。
//向棧中壓入一個對象(添加、新增)並返回對象
public E push(E item) {
addElement(item);
return item;
}
//同步取出棧頂元素。
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
//同步查詢棧頂元素
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
public boolean empty() {
return size() == 0;
}
//查詢一個元素對象離棧頂有多遠
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}