1 List
List接口是Collection接口的子接口,从其名称可以看出,是一个元素有序(并不是按大小排序,具有顺序索引,类似于数组),默认按照元素的添加顺序设置元素的索引。可分为ArrayList、LinkedList和Vector。List集合特有的迭代器:ListIterator(是Iterator的子接口)
1.1 ArrayList
ArrayList底层通过数组实现,是线程非安全的,查询速度快,添加删除比较慢,初始长度为10,可根据添加/删除元素动态改变大小。
//在指定索引处增加元素
public void add(int index, E element) {
//检查索引是否在数组大小范围内
rangeCheckForAdd(index);
//确保添加一个元素后,元素个数不会超过数组大小,如果超过了则动态增加数组大小
ensureCapacityInternal(size + 1); // Increments modCount!!
//把从index开始的元素后移一位
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
//存储空间增加
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
1.2 LinkedList
LinkedList实现了List接口,底层通过链表实现,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList 可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意LinkedList没有同步方法,线程非安全。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(…));
1.3 Vector
底层通过数组实现,线程安全的,增删查都比较慢。Vector还提供了Stack子类,实现了“栈”这一数据结构。因此Stack也是线程安全的,性能较差,可以通过使用LinkedList来实现栈。