Vector-源码解读

简介

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() 源码:

进入到 Vectoradd() 方法中:

在这里插入图片描述

首先可以看到该方法是用 synchronized 关键字修饰,所以它是线程安全的,但是效率低,该方法和 ArrayList 的 add() 方法大致相同:

  • ① 对集合修改次数 + 1
  • ensureCapacityHelper() 方法确定集合是否需要进行扩容
  • ③ 进行赋值操作,elementCount + 1

跟进 ensureCapacityHelper() 方法

在这里插入图片描述

这个方法会判断当前集合容量是否满足所需要的最小容量,如果不满足,就会执行 grow() 方法进行扩容

在这里插入图片描述

其中

        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);

这段代码为扩容的核心代码,大概意思就是

  • 如果设置了 容器增量(capacityIncrement),那么新容器大小 = 原本容器大小 + 容器增量
  • 如果没有设置容器增量(capacityIncrement),那么新容器大小 = 原本容器大小 × 2

最后通过 Arrays.copyOf() 方法 将原本的数据拷贝到新数组里面。

猜你喜欢

转载自blog.csdn.net/xhmico/article/details/129896295