Java中Vector与底层源码
Vector简介
前言: 建议首先了解ArrayList的底层源码
链接
底层结构
protect Object[] elementData
- 底层也是一个对象数组
- Vector是线程同步的, 即线程安全的
扩容机制
- 如果是无参构造, 则默认10, 满之后就会2倍扩容
- 如果是有参构造, 则按参数, 满之后就会2倍扩容
底层源码
利用debug以及断点功能追入
代码
public class Main {
public static void main(String[] args) {
Vector vector = new Vector();
}
}
初始化
无参构造器

发现无参构造器默认会先构造长度为10的Vector
带参构造器

可以发现就按参数来生成Vector, 当然如果长度小于0会抛出异常
扩容源码
代码
public class Main {
public static void main(String[] args) {
Vector vector = new Vector();
for (int i = 0; i < 11; i++) {
vector.add(i);
}
}
}
第一步.
首先自然还是int -> Integer的自动装箱, 封装成对象

第二步
然后是add()方法, 可以发现多了一个synchronized, 说明是线程安全的


注意:
- 这里
modCount也是代表修改次数 - 进入一个新的
add()方法 - 判断是否需要扩容, 如果需要就会执行
grow()方法
第三步
继续聚焦一下grow() 方法

可以与ArrayList 中的grow() 方法比较, 可以发现大同小异, 但是ArrayList 固定的扩容
是oldCapability >> 1, 但是这里是oldCapability, 所以可以得到结论
ArrayList默认扩容1.5倍, Vector扩容2倍
但是这里有一个新的变量capacityIncrement 这里我们发现好像见到过
对, 就是一开始构造器的部分

发现都会将此变量默认设置为0, 这样的话每次扩容就是两倍

浙公网安备 33010602011771号