面试期间曾被问到,这里做个简单的总结。
Vector和ArrayList都是List<E>接口的实现类,内部均通过数组实现,适合随机遍历查找,不适合中间插入和删除。
通过Java的源码,可以窥视两者的不同。以add()方法为例:
Vector:
public synchronized boolean add(E e) { modCount++; // From AbstractList, count the Structural modifications ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true; } /** * This implements the unsynchronized semantics of ensureCapacity. * Synchronized methods in this class can internally call this * method for ensuring capacity without incurring the cost of an * extra synchronization. * * @see #ensureCapacity(int) */ private void ensureCapacityHelper(int minCapacity) { int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object[] oldData = elementData; int newCapacity = (capacityIncrement > 0) ? (oldCapacity + capacityIncrement) : (oldCapacity * 2); if (newCapacity < minCapacity) { newCapacity = minCapacity; } elementData = Arrays.copyOf(elementData, newCapacity); } }
ArrayList:
public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; } public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
根据上述源码可知:
1. Vector是线程安全,而ArrayList不是。所以在非多线程环境,应该选择ArrayList,避免线程安全的系统开销
2. 当存储空间不够的时候,Vector扩展一倍(oldCapacity*2),而ArrayList扩展一半+1个((oldCapacity * 3)/2 + 1)。