03.Java 集合 - Vector

来源:互联网 发布:node express -e 编辑:程序博客网 时间:2024/05/17 08:47

基本概念

Vector 同 ArrayList 一样,底层数据结构都靠数组来实现。

与 ArrayList 的区别:Vector 的方法都是同步的,即线程安全。由于线程的同步必然要影响性能。因此,ArrayList 的性能比 Vector 好。

原理分析

以下源码均来源自 JDK 1.7。

1.内部构造

  • 继承关系,它和 ArrayList 一样都继承自 AbstractList。

这里写图片描述


  • 构造函数,Vector 的内部结构同 ArrayList 一样,都是由数组构成。

不同的是 ArrayList 在构建时只需指定容量大小,而 Vecotor 则需要指定容量大小、容量增加因子两个参数。

// 内部数组protected Object[] elementData;// 容量增加因子protected int capacityIncrement;// 元素个数protected int elementCount;public Vector() {    this(10);}public Vector(int initialCapacity) {    this(initialCapacity, 0);}public Vector(int initialCapacity, int capacityIncrement) {    super();    if (initialCapacity < 0){        // 抛出异常...    }    this.elementData = new Object[initialCapacity];    this.capacityIncrement = capacityIncrement;}

2.扩容检测

Vector 与 ArrayList 一样,内部都是基于数组来实现的。数组存在着容量固定的缺陷,因此在每次新增操作前,都要进行扩容检测,以保证后续添加进来的元素有存放空间。

public synchronized void ensureCapacity(int minCapacity) {    if (minCapacity > 0) {        modCount++;        ensureCapacityHelper(minCapacity);    }}private void ensureCapacityHelper(int minCapacity) {    if (minCapacity - elementData.length > 0){        grow(minCapacity);    }   }private void grow(int minCapacity) {    int oldCapacity = elementData.length;    // 关键-> 扩充公式:存在增长因子时,新容量 = 旧容量 + 增长因子;否则新容量 = 旧容量*2    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?         capacityIncrement : oldCapacity);    if (newCapacity - minCapacity < 0){        newCapacity = minCapacity;    }       if (newCapacity - MAX_ARRAY_SIZE > 0){        newCapacity = hugeCapacity(minCapacity);    }    // 将旧数组的元素复制到新数组当中去,完成扩容操作      elementData = Arrays.copyOf(elementData, newCapacity);}private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;private static int hugeCapacity(int minCapacity) {    if (minCapacity < 0){        throw new OutOfMemoryError();    }    return (minCapacity > MAX_ARRAY_SIZE) ?         Integer.MAX_VALUE : MAX_ARRAY_SIZE;}

整个过程与 ArrayList 大同小异,需要注意的有两个地方:capacityIncrement 、synchronized

  • capacityIncrement ,增长因子,它决定了 Vector 扩容操作的公式。同样地,这也是与 ArrayList 不同的地方, ArrayList 默认是新容量 = 旧容量*3。

  • synchronized ,同步标识。在 Vector 中几乎所有的方法都带有该关键字,说明基于 Vector 的操作都是线程安全的,即同一个时刻有且只有一个线程在操作它。正因为如此,也导致了它执行效率不如 ArrayList。


3.其他操作

由于 Vector 的内部结构与 ArrayList 相同,因此增删改查等操作原理也相同,这里不再分析。

唯一不同的是 Vector 的操作都是线程安全的。

0 0
原创粉丝点击