List(interface):
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
常用的实现List接口的有:
Vector
ArrayList
LinkedList
Vector:
底层是数组结构的。 protected Object[] elementData;
//添加方法:
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
//插入:
public synchronized void insertElementAt(E obj, int index) {
modCount++;
if (index > elementCount) {
throw new ArrayIndexOutOfBoundsException(index
+ " > " + elementCount);
}
ensureCapacityHelper(elementCount + 1);
System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
elementData[index] = obj;
elementCount++;
}
从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
Object src, int srcPos,Object dest, int destPos, int length
源数组 从哪里开始 目标数组 从哪里开始 多少长度
白话:就是将数组截成两截,从index开始,把原先的index上的位置往后挪一个位置,变成 { []_[] }.
从这些方法可以看出,Vector是线程同步的,这样在每个方法上的时候就会进行锁的判断,效率稍低。
ArrayList:
List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小.
所以在程序中,如果是单线程那么就用ArrayList,如果是多线程,并且涉及到并发访问同意资源,那么就用Vector