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 @   Xingon2356  阅读(7)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示