Java中Vector与底层源码

Vector简介

前言: 建议首先了解ArrayList的底层源码
链接

底层结构

protect Object[] elementData

  1. 底层也是一个对象数组
  2. Vector是线程同步的, 即线程安全的

扩容机制

  1. 如果是无参构造, 则默认10, 满之后就会2倍扩容
  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, 说明是线程安全的

注意:

  1. 这里modCount也是代表修改次数
  2. 进入一个新的add() 方法
  3. 判断是否需要扩容, 如果需要就会执行grow() 方法

第三步

继续聚焦一下grow() 方法

可以与ArrayList 中的grow() 方法比较, 可以发现大同小异, 但是ArrayList 固定的扩容
oldCapability >> 1, 但是这里是oldCapability, 所以可以得到结论

ArrayList默认扩容1.5倍, Vector扩容2倍

但是这里有一个新的变量capacityIncrement 这里我们发现好像见到过
对, 就是一开始构造器的部分

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

posted @ 2023-11-17 12:04  Xingon2356  阅读(25)  评论(0)    收藏  举报