Vector底层源码解析
创始人
2025-05-30 07:59:07
0

Java源码系列:下方连接
http://t.csdn.cn/Nwzed


文章目录

  • 前言
  • 一、Vectro底层源码逐步解析
  • Vector集合总结:发文3个工作日后 up 会把总结放入前言部分,但也诚邀读者总结,可放入评论区


前言

Vector集合总结:发文3个工作日后 up 会把总结放入前言部分,可谓“温故而知新”。


提示:以下是本篇文章正文内容,下面案例可供参考

集合体系继承图
在这里插入图片描述
Vector相对于ArrayList来说,Vector是线程安全的,它的每个方法几乎都加了synchronized关键字,Vector也是基于数组来存储元素的。
在这里插入图片描述
在这里插入图片描述

​​​​​​​​

一、Vectro底层源码逐步解析

还是和上一章的一样,就是换了一个集合。

老规矩,先来到无参构造,里面直接调用this关键字带赋值一个10进去,我们都知道this表示当前对象,也就是在无参构造中,调用了有参构造传了一个10进去。
在这里插入图片描述
可以看到在有参构造又调用了当前对象的另一个有参构造,构造一个具有指定初始容量且容量增量等于零的空向量,我们接着往下走
在这里插入图片描述
往下走,我们就走到了有参构造应该调用的方法,可见使用Vactro即使我们不传入参数也会自动调用到有参构造,上面传了一个 10 和 0 ,过来先拿 initialCapacity和0进行比较,如果小于0就抛出异常,因为我们的数组长度不能为负数。如果没有抛出异常将 10 赋值给 elementData 数组缓冲区(默认是0),执行完这一步我们就有了一个容量为 10 Vectro集合,继续往下走最后一步this.capacityIncrement = capacityIncrement; 这表示数组的容量增量,调用有参构造是传的 10,0 所以容量增量是 0
在这里插入图片描述
在这里插入图片描述

有了 长度为10的集合 然后往下走 add 方法,还是会先自动装箱,
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

从自动装箱出来,真正进入 add( ) ,可以看见Vector的add方法有 synchronized关键字修饰,是线程安全的。有线程拿到同步锁后。会先将监视器 modCount++,然后再去调用 ensureCapacityHelper( ) 计算容量看看是否需要扩容,

在这里插入图片描述
调用到 ensureCapacityHelper 方法,拿传过来的 minCapacity和默认的 10 进行比较,如果大于 0 就需要扩容,现在程序肯定是不会去扩容的,所以会一路返回到 add 方法。
在这里插入图片描述
返回到 add 方法,会把 e 的值 放入 elementData[ ] 的 elementCount下标处,elementCount下标是 0 ,等 e 的数据放入后进行 elementCount++,就变成了 1,下次添加元素会让 elementCount + 1去计算容量,不管计算结果如何,最后一路再返回到 add 方法,就会将元素放入 elementCount 的下标位置,由于上次进行了自加一,就会放在下标为 1 的位置,再让 elementCount ++,以便下次的计算容量。
在这里插入图片描述
由于默认数组为 10 ,现在一直没有扩容,我们让程序走到 for循环到11,进行扩容。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

走到扩容的方法,和ArrayList的大同小异,先拿到 lod的值,再用 old加上一个old也就是二倍扩容,但是这里为什么要使用三元表达式,而不去直接加一个 old上去,是因为 capacityIncrement 是用来标记 容量增量 的一个属性,通过三元表达式计算容量增量,如果为 true 大于 0,就使用自定义的容量增量,如果为 false就进行二倍扩容。然后将 old X 2 = 20 赋值给 newCapacity,判断 newCapacity - minCapacity < 0吗?20 - 11肯定大于 0 ,然后直接执行 Arrays.copyOf( ) 进行扩容。

在这里插入图片描述
在这里插入图片描述

Vector集合总结:发文3个工作日后 up 会把总结放入前言部分,但也诚邀读者总结,可放入评论区

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...