Vector相对于 ArrayList,可能在非并发场景下出现的比较少,
但是对于高并发开发来说, Vector是不可或缺的。
List有三种实现,ArrayList, LinkedList, Vector, 它们的区别在于, ArrayList是非线程安全的, Vector则是线程安全。
而至于 ArrayList和 LinkedList的区别呢, 在于 ArrayList是用数组来存储数据,LinkedList 用链表存储数据。
Vector拥有着和 ArrayList一样的存储方式, 它也是基于数组的。
不同的是,当数组大小不够存储新数据时他俩的扩展方式不同。 具体代码提现在这里, ArrayList的扩展逻辑是这样的
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);
}
}而 Vector的是,
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扩展数组时,默认扩展 50% + 1个, 而 Vector扩展 2倍。
Vector是线程安全的, 在空间不足时,它会默认扩展2倍的数组来存储数据。 而 ArrayList是线程不安全的, 在高并发的场景下,应该使用 Vector来代替 ArrayList。