Vector
继承自AbstractList,实现了List,RandomAccess,Cloneable,和Serializable接口,具有List的特性,提供可随机访问,提供自身克隆以及序列化的一个容器类。
特点:线程安全;数组实现
Vector的实现和ArrayList没什么区别,这里就不列成员变量和一些共有的方法了,有兴趣可以去看走进源码——ArrayList阅读笔记,这篇主要讲Vector和ArrayList的区别
-
区别一:线程安全
带synchronized关键字的获取迭代器的方法
在ArrayList中,所有的方法都是线程不安全的,在多线程环境下很容易出问题,而Vector就不一样了,Vector在涉及到操作容器数据的方法上,都加上了synchronized
关键字,甚至是迭代器的获取上也加上了这个关键字,我们可以感受下
带synchronized关键字的remove的方法
但是,凡事有利弊,这种线程绝对安全的保证的一个最明显的负面效应就是性能的损耗,特别是很多线程同时操作同一个Vector对象时,那么将会有很多很多线程被阻塞,是很不利于系统性能的。 -
区别二:初始化
相对于ArrayList中的初始化,Vector的其中一个初始化函数多了一个
protected int capacityIncrement;
形参,这个形参如其名,容量增长,取好听点,我们叫容量增长因子。
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
类似于ArrayList的带initialCapacity形参的构造函数,区别就在于初始化自身的capacityIncrement属性而已,其次还有下面两个
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
public Vector() {
this(10);
}
这里吐槽下this(10);
,在ArrayList那里起码还有一个DEFAULT_CAPACITY
,在Vector这里直接就是10....是懒了吗...Vector的默认初始化就是容量为10,容量增长因子为0
- 区别三:容量增长
在ArrayList中容量是1.5倍增加的,可能Vector的设计者觉得这个1.5太可怕了(特别在数量级达到万之后的单位),所以才在vector里增加这个容量增长因子的东西,下面直接上核心代码
private void grow(int minCapacity) {
// overflow-conscious code
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);
}
很明显,如果在初始化的时候传入了capacityIncrement
,那么,vector的每次容量的增长都是以capacityIncrement
为单位进行增长的,所以就没有了ArrayList中直接增大1.5倍的爆炸增长速率
其余的实现和ArrayList都是大同小异,这里就不在撰述了
网友评论