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, 这样的话每次扩容就是两倍
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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)