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;
}