1. Vector 简介

  1. Vector ArrayList 极度相似,都是一个动态数组队列;

1.1 实现细节

  1. public class Vector<E>
  2. extends AbstractList<E>
  3. 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对比

  • 分析
  1. 由于Vector在原理上和ArrayList上相似,所以我们不准备花费大量的精力去归类源码,以简明的两者对比来突出重点内容;

2.1 Vector 性质

  • 遗留容器
  1. Vector属于遗留容器(Java早期的版本中提供的容器,除此之外,HashtableDictionaryBitSetStackProperties都是遗留容器),已经不推荐使用,但是由于ArrayListLinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现);

2.2 两者对比

2.2.1 相同点

  • ArrayList和Vector都是继承了相同的父类和实现了相同的接口
  • 底层都是数组实现的
  • 初始化默认长度都是10

2.2.2 不同点

  • Vector线程安全,ArrayList线程不安全
  1. Vector的方法都是线程同步的(都是加锁的),而ArrayList的方法不是,具体可以查看ArrayList的讲解部分理解其线程不安全(核心在于size++这不是原子性操作),由于线程安全必然会影响性能,因此,ArrayList的性能比Vector好;
  • ArrayList的扩容机制是每次增加50%,而Vector的扩容机制是每次扩容一倍
  1. 1.ArrayListgrow()方法:
  2. int newCapacity = oldCapacity + (oldCapacity >> 1);
  3. 2. Vectorgrow()方法
  4. int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
  5. capacityIncrement : oldCapacity);
  • Vector可以设置增长因子,而ArrayList不可以,
  1. 看下上面两者grow方法的不同,ArrayList的是直接得到旧容量的1.5倍大小之后赋值给ArrayList;
  2. Vector则是多了一点,就是capacityIncrement,他是什么??!!
  3. Vector存在一个构造器:
  4. public Vector(int initialCapacity, int capacityIncrement) {
  5. super();
  6. if (initialCapacity < 0)
  7. throw new IllegalArgumentException("Illegal Capacity: "+
  8. initialCapacity);
  9. this.elementData = new Object[initialCapacity];
  10. this.capacityIncrement = capacityIncrement;
  11. }
  12. 意思就是在初始化Vector的时候,就可以直接对其这个特性赋值,如果赋值过(即capacityIncrement),
  13. 在扩容的时候就会按照认为capacityIncrement这个值去扩容,否则默认选择旧容量;