1. Vector 简介
Vector 和 ArrayList 极度相似,都是一个动态数组队列;
1.1 实现细节
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
1.1.1 实现和继承关系
- 继承 抽象类AbstractList,实现了List;List是一个数组队列,提供了相关的添加,删除,修改,遍历等功能;
- 实现 RandomAccess接口,即提供了随机访问功能;RandmoAccess 是 java 中用来被 List 实现,为 List 提供快速访问功能的。在 ArrayList 中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。
- 实现 Cloneable接口,即覆盖了clone()方法,能被克隆;
- 实现 java.io.Serializable 接口,支持序列化,能通过序列化去传输;
2. Vector和Arraylist对比
由于Vector在原理上和ArrayList上相似,所以我们不准备花费大量的精力去归类源码,以简明的两者对比来突出重点内容;
2.1 Vector 性质
Vector属于遗留容器(Java早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),已经不推荐使用,但是由于ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现);
2.2 两者对比
2.2.1 相同点
- ArrayList和Vector都是继承了相同的父类和实现了相同的接口
- 底层都是数组实现的
- 初始化默认长度都是10
2.2.2 不同点
- Vector线程安全,ArrayList线程不安全
Vector的方法都是线程同步的(都是加锁的),而ArrayList的方法不是,具体可以查看ArrayList的讲解部分理解其线程不安全(核心在于size++这不是原子性操作),由于线程安全必然会影响性能,因此,ArrayList的性能比Vector好;
- ArrayList的扩容机制是每次增加50%,而Vector的扩容机制是每次扩容一倍
1.ArrayList的grow()方法:
int newCapacity = oldCapacity + (oldCapacity >> 1);
2. Vector的grow()方法
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
- Vector可以设置增长因子,而ArrayList不可以,
看下上面两者grow方法的不同,ArrayList的是直接得到旧容量的1.5倍大小之后赋值给ArrayList;
而Vector则是多了一点,就是capacityIncrement,他是什么??!!
Vector存在一个构造器:
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
意思就是在初始化Vector的时候,就可以直接对其这个特性赋值,如果赋值过(即capacityIncrement),
在扩容的时候就会按照认为capacityIncrement这个值去扩容,否则默认选择旧容量;