Java 集合 Vector

98 阅读1分钟
原文链接: mp.weixin.qq.com

Vector相对于 ArrayList,可能在非并发场景下出现的比较少,

但是对于高并发开发来说, Vector是不可或缺的。

List的实现之一

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。