Vector和ArrayList非常相似,它们都实现了相同的接口,继承相同的类,就连方法的实现也非常类似。和ArrayList不同的是,Vector是线程安全的,关键方法上都加了synchronized同步锁,由于Vector效率不高,所以使用的较少,要使用线程安全的ArrayList,推荐CopyOnWriteArrayList,后续再做分析,这里仅记录下Vector源码,基于JDK1.8。
类结构
Vector的类关系图和ArrayList一致:
Vector可以存放任意类型元素(包括null),允许重复,和ArrayList一致,内部采用Object类型数组存放数据,包含以下三个成员变量:
1 | // Object数组,存放数据 |
方法解析
构造函数
1 | public Vector(int initialCapacity, int capacityIncrement) { |
可以看到,当我们调用new Vector()
创建Vector集合时,直接创建了一个容量为10的Object数组(和ArrayList不同,ArrayList内部数组初始容量为0,只有在添加第一个元素的时候才扩容为10),并且capacityIncrement为0,意味着容量不足时,新数组容量为旧数组容量的2倍。
add(E e)
1 | public synchronized boolean add(E e) { |
添加逻辑和ArrayList的add方法大体一致,区别在于扩容策略有些不同,并且方法使用synchronized关键字修饰。
set(int index, E element)
1 | public synchronized E set(int index, E element) { |
逻辑和ArrayList的set方法一致,方法使用synchronized关键字修饰。
get(int index)
1 | public synchronized E get(int index) { |
逻辑和ArrayList的get方法一致,方法使用synchronized关键字修饰。
remove(int index)
1 | public synchronized E remove(int index) { |
逻辑和ArrayList的remove方法一致,方法使用synchronized关键字修饰。
trimToSize()
1 | public synchronized void trimToSize() { |
逻辑和ArrayList的trimToSize方法一致,方法使用synchronized关键字修饰。
剩下的方法源码自己查看,大体和ArrayList没有什么区别。Vector的方法都用synchronized关键字来确保线程安全,每次只有一个线程能访问此对象,在线程竞争激烈的情况下,这种方法效率非常低,所以实际并不推荐使用Vector。