Vector源码解析

/ Java / 1 条评论 / 538浏览

在之前的文章中本人已经介绍过了ArrayList底层是通过数组的方式实现的,在Java的集合类中,除了ArrayList外,还有一些其它的集合类它们底层也是采用数组的方式实现的,例如Vector集合类。那它们在使用上或者说在底层的实现方式上有何不同的呢?接下来我们将详细来分析一下Vector集合的相关知识。

因为大部分的知识点已经在ArrayList这篇文章中介绍过了,所以这里我们就不在做详细说明了,而是直接来分析Vector的底层源码,来对比一下Vector集合与ArrayList集合在底层有何不同。我们还是和ArrayList集合一样还是先看一下Vector集合的初始化,也就是构造方法。

public Vector() {
this(10);
}
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}

虽然上面是3个不同的构造方法,但是我们通过方法的调用关系就可得知,如果我们使用无参的构造方法来创建Vector对象时,那么上述的3个方法都会依次执行。并且我们知道上述方法中最核心的方法也就是给数组初始化的代码就是第3个构造方法。因为我们已经分析过了ArrayList中的源码,所以我们可以很容易得出以下结论:

下面我们分析一下Vector集合的add()方法的实现逻辑。

public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
private void ensureCapacityHelper(int minCapacity) {
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
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);
}

上述的代码貌似我们很眼熟啊有没有,没错上述的代码逻辑,其实和ArrayList源码逻辑几乎一样。唯一的区别就是Vector集合和ArrayList集合的动态分配方式不一样 。在ArrayList那篇文章中,我们已经知道了,当底层数组已经达到最大容量时,会自动创建一个比原数组大1.5倍的数组。那么在上述代码中我们发现,Vector集合的底层扩展规律是会创建一个是原数组2倍的数组来存储元素。这也就是Vector集合与ArrayList集合的区别之一。既然是区别之一,那么就一定还有其它的区别,我们发现在add()方法中添加了synchronized同步关键字,这就说明Vector集合是一个线程安全的集合类,这也是与ArrayList集合的区别之一,因为ArrayList集合并不是一个线程安全的集合类。

因为Vector集合底层也是采用数组的方式实现的,所以它的弊端基本和ArrayList集合一样 ,这里就不在做过多的介绍了。但有一点要注意,因为Vector集合是线程安全的集合类,所以我们在开发多线程时,可以直接使用而无需要添加额外的同步的代码,就可保证线程的安全。但是,如果我们开发时不是在多线程环境中运行的,如果我们继续使用Vector集合时,就会造成我们程序的性能降低,这是因为Vector集合底层使用了ynchronized同步关键字,所以每次执行add()方法时,都有频繁的执行获取锁和释放锁操作,这样就会在无形之中,影响程序的性能。所以,我们在日常的开发中,如果不是在多线程环境中使用List集合的话,那么我们推荐使用ArrayList或LinkedList集合,因为它们不是线程安全的集合类,所以也就不会频繁的执行获取锁和释放锁操作,所以相比Vector集合,程序的运行效率较高。

  1. 这个确实写的不错。把vector集合写的透彻,学习了

    回复