简介
Vector 类实现了一个动态数组。和 ArrayList 很相似,但是两者是不同的:
- Vector 是同步访问的
- Vector 包含了许多传统的方法,这些方法不属于集合框架
Vector 类的定义说明:
它的底层也是一个数组对象 protected Object[] elementData
,它的方法带有 synchronized
关键字,所以是线程安全的,在开发中,需要线程同步安全的时候,考虑使用。
与 ArrayList
的比较:
底层结构 | 版本 | 线程安全 | 扩容倍数 | |
---|---|---|---|---|
ArrayList | 可变数组 | JDK1.2 | 不安全,效率高 | 1.5 倍 |
Vector | 可变数组 | JDK1.0 | 安全,效率低 | 2 倍 |
源码解读
PS:以下源码来源于 JDK1.8
这里我写了一个测试方法,通过 debug 的方式去阅读源码,打上断点,运行
先执行以下这行代码:
// 无参构造
Vector vector = new Vector();
程序会走到 Vector 类的无参构造方法中
无参构造方法源码:
由此可见在无参构造方法中实际上是调用了它的Vector(int initialCapacity) 有参构造方法
,初始容量的大小默认为 10
进入到 Vector 类的有参构造方法中
有参构造方法源码:
不管有无带参数(该 Vector(Collection c)
构造方法除外),最后都会进入到 Vector(int initialCapacity, int capacityIncrement);
这个有参构造方法中,它里面做了三件事:
- ① 校验初始化容器大小是否合法
- ② 给 elementData 赋值为指定容量的 Object 数组对象
- ③ 设置容器增量
capacityIncrement
接着执行以下代码往集合中添加元素
// 添加元素
vector.add(1);
add() 源码:
进入到 Vector
的 add()
方法中:
首先可以看到该方法是用 synchronized
关键字修饰,所以它是线程安全的,但是效率低,该方法和 ArrayList 的 add()
方法大致相同:
- ① 对集合修改次数 + 1
- ②
ensureCapacityHelper()
方法确定集合是否需要进行扩容 - ③ 进行赋值操作,elementCount + 1
跟进 ensureCapacityHelper()
方法
这个方法会判断当前集合容量
是否满足所需要的最小容量
,如果不满足,就会执行 grow()
方法进行扩容
其中
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
这段代码为扩容的核心代码,大概意思就是
- 如果设置了
容器增量(capacityIncrement)
,那么新容器大小 = 原本容器大小 + 容器增量 - 如果
没有
设置容器增量(capacityIncrement)
,那么新容器大小 = 原本容器大小 × 2
最后通过 Arrays.copyOf() 方法
将原本的数据拷贝
到新数组里面。