当前位置: 首页 > news >正文

Vector底层结构和源码分析

Vector的基本介绍

1.Vector类的定义说明

public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable

2)Vector底层也是一个对象数组,protected Objectl] elementData;

3)Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized

4)在开发中,需要线程同步安全时,考虑使用Vector

通过上面的Vector类我们可以看到Vector实现了很多接口,实现了List接口,还实现了Serializable接口,就代表可串行化,数据可以在网络上传输

Vector源码分析

我们先来看看Vector的扩容机制的结果是什么吧

结论

1.如果使用的是无参构造器,默认是10,第二次就按照两倍进行扩容

2.如果使用的是有参构造器,则就按照我们指定的大小,两倍扩容

源码分析:

//源码分析
//1. new Vector() 底层
/*public Vector() {//即使你没有指定大小会默认给你一个10,最后调用的还是有参构造器this(10);}
    所以即使开始使用的是无参构造器,但是因为默认给了10所以,所以最后走的还是带参数的构造器,也就是这个public Vector(int initialCapacity) {this(initialCapacity, 0);}补充:如果是  Vector vector = new Vector(8); 也就是使用有参构造器使用的方法就是:public Vector(int initialCapacity) {this(initialCapacity, 0);}2. vector.add(i)2.1  //下面这个方法就添加数据到vector集合public synchronized boolean add(E e) {//该变量记录集合被修改的次数modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;}2.2  //确定是否需要扩容 条件 : minCapacity - elementData.length>0private void ensureCapacityHelper(int minCapacity) {// overflow-conscious code//意识就是 当前的最小容量-你需要的容量 如果 大于- 说明不够用了,就需要进行扩容if (minCapacity - elementData.length > 0)grow(minCapacity);}2.3 //如果 需要的数组大小 不够用,就扩容 , 扩容的算法//newCapacity = oldCapacity + ((capacityIncrement > 0) ?//                             capacityIncrement : oldCapacity);//就是扩容两倍.private void grow(int minCapacity) {// overflow-conscious code//因为第一次进来的时候,emlementData.length长度是0 所以将0赋给了oldCapacityint oldCapacity = elementData.length;//这里就是两倍扩容最关键的地方,我们在一进来就先把,当前elementData数组的长度赋值给了oldCapacity 然后判断capacityIncrement是否大于0 但是capacityIncrement是0 所以还是返回oldCapacity 这样就相当于两次oldCapacity相加,就实现了两次扩容int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);}*/
package com.list_;import java.util.Vector;@SuppressWarnings({"all"})
public class Vector_ {public static void main(String[] args) {//无参构造器//有参数的构造Vector vector = new Vector(8);for (int i = 0; i < 10; i++) {vector.add(i);}vector.add(100);System.out.println("vector=" + vector);//源码分析//1. new Vector() 底层/*public Vector() {//即使你没有指定大小会默认给你一个10,最后调用的还是有参构造器this(10);}所以即使开始使用的是无参构造器,但是因为默认给了10所以,所以最后走的还是带参数的构造器,也就是这个public Vector(int initialCapacity) {this(initialCapacity, 0);}补充:如果是  Vector vector = new Vector(8); 也就是使用有参构造器使用的方法就是:public Vector(int initialCapacity) {this(initialCapacity, 0);}2. vector.add(i)2.1  //下面这个方法就添加数据到vector集合public synchronized boolean add(E e) {//该变量记录集合被修改的次数modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;}2.2  //确定是否需要扩容 条件 : minCapacity - elementData.length>0private void ensureCapacityHelper(int minCapacity) {// overflow-conscious code//意识就是 当前的最小容量-你需要的容量 如果 大于- 说明不够用了,就需要进行扩容if (minCapacity - elementData.length > 0)grow(minCapacity);}2.3 //如果 需要的数组大小 不够用,就扩容 , 扩容的算法//newCapacity = oldCapacity + ((capacityIncrement > 0) ?//                             capacityIncrement : oldCapacity);//就是扩容两倍.private void grow(int minCapacity) {// overflow-conscious code//因为第一次进来的时候,emlementData.length长度是0 所以将0赋给了oldCapacityint oldCapacity = elementData.length;//这里就是两倍扩容最关键的地方,我们在一进来就先把,当前elementData数组的长度赋值给了oldCapacity 然后判断capacityIncrement是否大于0 但是capacityIncrement是0 所以还是返回oldCapacity 这样就相当于两次oldCapacity相加,就实现了两次扩容int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);}*/}
}

Vector和ArrayList的比较

底层结构版本线程安全(同步)效率扩容倍数
ArrayList可变数组jdk1.2不安全,效率高如果有参构造1.5倍,如果是无参第一次10第二次1.5倍扩
Vector可变数组Object[]jdk1.0安全,效率不高如果是无参,默认10,满后就按2倍扩容如果指定大小则每次按2倍扩容

相关文章:

Vector底层结构和源码分析

Vector的基本介绍 1.Vector类的定义说明 public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable 2)Vector底层也是一个对象数组&#xff0c;protected Objectl] elementData; 3)Vector是线程同步的&…...

计算卸载论文阅读01-理论梳理

标题&#xff1a;When Learning Joins Edge: Real-time Proportional Computation Offloading via Deep Reinforcement Learning 会议&#xff1a;ICPADS 2019 一、梳理 问题&#xff1a;在任务进行卸载时&#xff0c;往往忽略了任务的特定的卸载比例。 模型&#xff1a;针…...

Windows 11 本地 php 开发环境搭建:PHP + Apache + MySQL +VSCode 安装和环境配置

目录 前言1. PHP 的下载、安装和配置1.1 下载 php1.2 安装 php1.3 配置 php 系统变量1.4 配置 php.ini 2. Apache 的下载、安装和配置2.1 下载 Apache2.2 安装 Apache2.3 修改配置 Apache2.4 指定服务端口&#xff08;非必须&#xff09;2.5 配置系统变量2.6 安装服务2.7 Apach…...

15个使用率超高的Python库,下载量均过亿

今天给大家分享最近一年内PyPI上下载量最高的Python包。现在我们来看看这些包的作用&#xff0c;他们之间的关系&#xff0c;以及为什么如此流行。 1. Urllib3&#xff1a;8.93亿次下载 Urllib3 是 Python 的 HTTP 客户端&#xff0c;它提供了许多 Python 标准库没有的功能。 …...

所有知识付费都可以用 ChatGPT 再割一次?

伴随春天一起到来的&#xff0c;还有如雨后春笋般冒出的 ChatGPT / AI 相关的付费社群、课程训练营、知识星球等。 ChatGPT 吹来的这股 AI 热潮&#xff0c;这几个月想必大家多多少少都能感受到。 ▲ 图片来源&#xff1a;网络 这两张图是最近在圈子里看到的。 一张是国内各…...

Python中“is”和“==”的区别(避坑)

2.3 “is”和“”的区别 在Python编写代码时&#xff0c;经常会遇到需要判断2个对象是否相等的情况&#xff0c;这个时候一般就会想到使用is和&#xff0c;is和好像都可以用来判断对象是否相等&#xff0c;经常会傻傻分不清&#xff0c;但其实这其中还是有区别的。 不过在这之…...

20230426----重返学习-vue-router路由

day-058-fifty-eight-20230426-vue-router路由 vue-router路由 路由&#xff1a;切换页面&#xff0c;单页面应用上使用的 hash模式—锚点 对应vue版本 如何使用路由版本 vue2 —> router3vue3 —> router4 使用vue-router 创建项目的时候&#xff0c;直接选中路由…...

Java字节码指令

Java代码运行的过程是Java源码->字节码文件(.class)->运行结果。 Java编译器将Java源文件&#xff08;.java&#xff09;转换成字节码文件(.class)&#xff0c;类加载器将字节码文件加载进内存&#xff0c;然后进行字节码校验&#xff0c;最后Java解释器翻译成机器码。 …...

Vue3之setup参数介绍

setup(props, context) {... }一、参数 使用setup函数时&#xff0c;它将接受两个参数&#xff1a; propscontext 让我们更深入地研究如何使用每个参数 二、Props setup函数中的第一个参数是props。正如在一个标准组件中所期望的那样&#xff0c;setup函数中的props是响应…...

ESET NOD32 互联网安全软件和防毒软件 -简单,可靠的防护。

安全防范病毒和间谍软件&#xff0c;银行和网上购物更安全, 网络摄像头和家用路由器使用更安全&#xff0c;阻止黑客访问您的电脑, 让您的孩子网络安全&#xff1b;产品兑换码仅支持中国ip地址兑换&#xff0c;兑换后可全球通用。 简单&#xff0c;可靠的防护 防范黑客&#x…...

试试这几个冷门但好用的软件吧

软件一&#xff1a;探记 探记是一款专注于个人记录每一条记录的工具&#xff0c;主要特点如下&#xff1a; 简单易用&#xff1a;探记的界面设计简洁明了&#xff0c;操作流程简单易用&#xff0c;用户可以快速、方便地添加记录。 多样化记录类型&#xff1a;探记支持多种记…...

【云原生】k8s NetworkPolicy 网络策略是怎么样的

前言 随着微服务的流行&#xff0c;越来越多的云服务平台需要大量模块之间的网络调用。 在 Kubernetes 中&#xff0c;网络策略(NetworkPolicy)是一种强大的机制&#xff0c;可以控制 Pod 之间和 Pod 与外部网络之间的流量。 Kubernetes 中的 NetworkPolicy 定义了一组规则&…...

手把手教你用几行代码给winform多个控件(数量无上限)赋值

前言&#xff1a; 我们在开发winform程序的过程中&#xff0c;经常会遇到这样一个场景&#xff0c;我们设计的界面&#xff0c;比如主窗体有一百多个TextBox&#xff0c;然后初始化的时候要对这个一百多个TextBox的Text属性赋值&#xff0c;比如赋个1&#xff0c;如果是winfor…...

回炉重造十一------ansible批量安装服务

1.playbook的核心组件 Hosts 执行的远程主机列表Tasks 任务集,由多个task的元素组成的列表实现,每个task是一个字典,一个完整的代码块功能需最 少元素需包括 name 和 task,一个name只能包括一个taskVariables 内置变量或自定义变量在playbook中调用Templates 模板&#xff0c;…...

系统集成项目管理工程师 笔记(第20章:知识产权管理、第21章:法律法规和标准规范)

文章目录 20.1.2 知识产权的特性 58420.2.1 著作权及邻接权 58520.2.2 专利权 58920.2.3 商标权 59221.3 诉讼时效 59921.6.3 标准分级与标准类型 60321.7.2 信息系统集成项目管理常用的技术标准 6061、基础标准2、开发标准3、文档标准4、管理标准 第20章 知识产权管理 584 20.…...

Channel-wise Knowledge Distillation for Dense Prediction(ICCV 2021)原理与代码解析

paper&#xff1a;Channel-wise Knowledge Distillation for Dense Prediction official implementation&#xff1a;https://github.com/irfanICMLL/TorchDistiller/tree/main/SemSeg-distill 摘要 之前大多数用于密集预测dense prediction任务的蒸馏方法在空间域spatial…...

No.052<软考>《(高项)备考大全》【冲刺6】《软考之 119个工具 (4)》

《软考之 119个工具 &#xff08;4&#xff09;》 61.人际交往:62.组织理论:63.预分派:64.谈判:65.招募:66.虚拟团队:67.多标准决策分析:68.人际关系技能:69.培训:70.团队建设活动:71.基本规则:72.集中办公:73.认可与奖励:74.人事评测工具:75.观察和交谈:76.项目绩效评估:77.冲…...

Go | 一分钟掌握Go | 9 - 通道

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱编写&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 前言 在Java中&#xff0c;多线程之间的通信方式有哪些&#xff1f;记得吗&…...

【建议收藏】计算机视觉是什么?这几个计算机视觉的核心任务你真的了解吗?

文章目录 &#x1f4da;引言&#x1f4d6;计算机视觉的核心任务&#x1f4d1;图像分类和对象识别&#x1f4d1;目标检测&#x1f4d1;语义分割&#x1f4d1;实例分割&#x1f4d1;图像生成 &#x1f4d6;计算机视觉的应用领域&#x1f4d1;人脸识别&#x1f4d1;自动驾驶&#…...

BatteryChargingSpecification1.2中文详解

1. Introduction 1.1 Scope 规范定义了设备通过USB端口充电的检测、控制和报告机制&#xff0c;这些机制是USB2.0规范的扩展&#xff0c;用于专用 充电器&#xff08;DCP&#xff09;、主机(SDP)、hub(SDP)和CDP(大电流充电端口)对设备的充电和power up。这些机制适用 于兼…...

NSIS进阶玩法:手把手教你用HM NIS Edit打造个性化安装界面(替换图标、文字与进度条)

NSIS深度定制指南&#xff1a;从默认界面到品牌化安装体验 当用户双击你的安装程序时&#xff0c;第一印象往往决定了他们对产品的整体期待。那些千篇一律的NSIS默认界面&#xff0c;就像穿着标准制服的接待员——功能完备但缺乏个性。作为开发者&#xff0c;我们完全有能力让安…...

视觉驱动的空间碎片智能感知方法【附数据】

✨ 长期致力于空间碎片、智能感知、图像融合、显著性检测、目标识别研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;像素级图像融合的低照度增强方法&…...

Adams新手避坑指南:从Box到拉伸体,教你正确给几何模型‘赋予灵魂’(含质量设置)

Adams新手避坑指南&#xff1a;从几何体到动力学构件的关键转换 在Adams中创建几何模型时&#xff0c;许多新手用户会遇到一个令人困惑的现象&#xff1a;明明已经画好了精致的Box、Cylinder等几何体&#xff0c;但进行动力学仿真时&#xff0c;这些模型要么纹丝不动&#xff0…...

FPGA验证核心:Vivado中功能与代码覆盖率的实战指南

1. 项目概述&#xff1a;为什么验证是FPGA开发的重中之重&#xff1f; 如果你刚接触FPGA开发&#xff0c;可能会觉得写代码&#xff08;HDL&#xff09;是最核心、最花时间的部分。但等你真正上手几个项目&#xff0c;尤其是那些需要流片或者部署到关键系统的项目后&#xff0c…...

Windows 环境 OpenClaw 部署详解|从安装到使用全流程

OpenClaw&#xff08;小龙虾&#xff09;Windows 一键部署教程&#xff5c;10 分钟搭建自动化数字员工 前言 OpenClaw&#xff08;俗称小龙虾&#xff09;是 2026 年热门的开源 AI 智能体&#xff0c;GitHub 星标突破 28 万&#xff0c;主打本地运行、低门槛、自动化执行。本…...

告别内存泄漏!LabVIEW调用Halcon后必须做的资源释放操作(附HImage、HWindow关闭方法)

LabVIEW与Halcon混合编程中的资源管理实战指南 在工业自动化检测领域&#xff0c;LabVIEW与Halcon的结合堪称黄金搭档——前者提供灵活的流程控制&#xff0c;后者拥有强大的图像处理能力。但许多工程师在开发长期运行的视觉系统时&#xff0c;常常遇到一个隐形杀手&#xff1a…...

生物医学论文降AI工具免费推荐:2026年生物医学毕业论文知网AIGC超标免费4.8元一次过完整方案

生物医学论文降AI工具免费推荐&#xff1a;2026年生物医学毕业论文知网AIGC超标免费4.8元一次过完整方案 整理了一份生物医学论文降AI的完整选购指南&#xff0c;按性价比排序。 首推嘎嘎降AI&#xff08;www.aigcleaner.com&#xff09;&#xff0c;4.8元&#xff0c;99.26%…...

如何快速提升Windows性能:终极系统优化完整指南

如何快速提升Windows性能&#xff1a;终极系统优化完整指南 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-zh_CN …...

DDrawCompat开源项目:让Windows经典游戏在现代系统重生

DDrawCompat开源项目&#xff1a;让Windows经典游戏在现代系统重生 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/DDraw…...

RK3562核心板开发指南:从硬件设计到AI部署的全流程解析

1. 项目概述&#xff1a;从一颗芯片到一套完整的开发资源最近在嵌入式圈子里&#xff0c;RK3562这颗芯片的热度持续攀升。作为瑞芯微面向中高端AIoT和工业应用推出的新一代处理器&#xff0c;它凭借其均衡的CPU/GPU/NPU性能和出色的能效比&#xff0c;吸引了不少开发者的目光。…...