1. 概述
上文「JDK源码分析-ArrayList」主要分析了 ArrayList 的实现原理。本文分析 List 接口的另一个实现类:Vector。
Vector 的内部实现与 ArrayList 类似,也可以理解为一个「可变数组」。其继承结构如下(省略部分接口):
PS: 由于 Vector 目前使用较少,且官方也推荐在无线程安全的需求时使用 ArrayList 代替 Vector,这里仅研究其实现原理。
stackoverflow 也有相关的讨论:https://stackoverflow.com/questions/1386275/why-is-java-vector-and-stack-class-considered-obsolete-or-deprecated
2. 代码分析
仍然从其构造器入手进行分析。
2.1 构造器
Vector 对外提供四个构造器(内部可以认为是两个),其一:
protected
与 ArrayList 类似,Vector 内部也维护了一个 Object 类型的数组(elementData)来存储元素(默认初始容量也是 10)。不同的是:Vector 比 ArrayList 的构造器多了一个参数 capacityIncrement,该变量也导致了二者的扩容方式略有不同,后面进行分析。
其二:入参为集合的构造器
public
2.2 扩容原理分析
我们仍从其 add() 方法入手进行分析:
public
注意这里的关键字 synchronized。观察可以发现:Vector 内部许多方法都使用了该关键字,这也是 Vector 实现线程安全的方式,简单粗暴!
其扩容方法实现如下:
/**
从这里可以看出,Vector 与 ArrayList 的扩容方式基本一致,只是新容量的计算方式有所不同,这里分析下其新容量大小:
int
Vector 计算扩容后的新容量时,根据 capacityIncrement 的值可以分为两种情况:
- capacityIncrement > 0:新容量 = 旧容量 + capacityIncrement;
- capacityIncrement <= 0:新容量 = 旧容量 * 2。
3. 线程安全性
Vector 是线程安全的,它实现线程安全的方式也很简单粗暴:直接在方法上使用 synchronized 关键字进行同步。
4. 小结
- 与 ArrayList 类似,Vector 也可以认为是「可变数组」;
- 扩容原理与 ArrayList 基本一致,只是新容量计算方式略有不同:指定增长容量时,新容量为旧容量 + 增长容量;否则扩容为旧容量的 2 倍;
- 线程安全的,实现方式简单(synchronized);
- 当前使用较少,这里仅学习其实现原理。