Jaca集合(四)Vector集合底层源码分析

news/2024/5/17 14:07:46/文章来源:https://blog.csdn.net/weixin_59448049/article/details/127145649

Vector的基本介绍:

(1)Vector类的定义说明:我们进入源码界面进行查看:

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

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

数据放在对象数组里面:

 

(3)Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized(支持线程同步和互斥)我们在源码里面发现它的一个普通的方法也带有synchronized:

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

单线程用ArrayList,效率比较高。多线程用Vector,效率比较低。

Vector底层结构和ArrayList的比较:

Vector和ArrayList的比较:

底层结构版本线程安全(同步)效率扩容倍数
ArrayList可变数组jdk1.2不安全,效率高

如果有参构造按1.5倍,

如果是无参构造,第一次为10,从第二次开始按1.5倍扩容

Vector

可变数组

Object [ ]

jdk1.0安全,效率不高

如果是无参,默认为10,如果不够,就按2倍扩容;

如果指定大小,则每次直接按2倍扩

 

无参构造底层源码分析: 

 我们设置代码来进行查看:

package com.rgf.list;import java.util.Vector;
@SuppressWarnings({"all"})
public class Vector_ {public static void main(String[] args) {//无参构造器Vector vector = new Vector();for (int i = 0; i < 10; i++) {vector.add(i);}vector.add(100);}
}

我们进行debug之后:

 我们发现继续进行下一步之后如下所示:

我们发现无参构造设置的空间为10.

我们继续进行下一步。 

我们先进行自动装箱:

 装箱完成之后,我们进入add方法源码界面:添加数据到Vector集合

 public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;}

我们发现该方法与ArrayList的方法名称不同,我们进入源码界面进行查看:‘(判断是否需要进行扩容)

 我们继续往下走之后我们会发现Vector里面存在数据了。

我们将该数据存储满之后,我们进行对vector.add(100);该行代码进行debug。

我们进入扩容代码如下所示:

如果需要的数组大小不够用,就进行扩容。

private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);
//三元运算符:判断条件?表达式1:表达式2
如果判断条件为真,则返回capacityIncrement,如果判断条件为假,则返回oldCapacity。
capacityIncrement它的值为0,所以相加之后为两倍的oldCapacity。if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);}

其中扩容最重要的代码为:

 int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);
//三元运算符:判断条件?表达式1:表达式2
如果判断条件为真,则返回capacityIncrement,如果判断条件为假,则返回oldCapacity。
capacityIncrement它的值为0,所以相加之后为两倍的oldCapacity。

  有参构造底层源码代码如下所示:

package com.rgf.list;import java.util.Vector;
@SuppressWarnings({"all"})
public class Vector_ {public static void main(String[] args) {//无参构造器Vector vector = new Vector();for (int i = 0; i < 10; i++) {vector.add(i);}vector.add(100);//有参构造器Vector vector1 = new Vector(8);for (int i = 0; i < 10; i++) {vector1.add(i);}System.out.println("vector="+vector);}
}

我们利用Debug进行逐步运行,如下所示:

 我们进入之后,即可看到容量为8,我们再往进即可看到:

 之后进入vector.add方法:

 之后我们进入ensureCapacityHelper方法进行判断:

而我们再ArrayList里面进行判断的方法为(ensureCapacityInternal):

我们判断不用进行扩容,即返回进去后: 将0值赋值给elementCount数组,同时elementCount进行自增。

 之后的扩容与无参数构造的扩容一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_206599.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt之事件处理机制

目录 一、事件简介 二、事件的处理 1.重写notify处理函数 2.事件过滤器 3.重写event处理函数 4.重写特定事件处理函数 三、事件的发送 一、事件简介 Qt 是一个基于 C 的框架&#xff0c;主要用来开发带窗口的应用程序。使用的基于窗口的应用程序都是基于事件&#xff0c…

网课查题公众号题库接口

网课查题公众号题库接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&#xf…

05-Elasticsearch-DSL高级检索[分页, 分词, 权重, 多条件, 过滤, 排序, 关键词高亮, 深度分页, 滚动搜索, 批量Mget]

DSL搜索 词库准备骚年 帅气 新闻网 新闻 闻网 新 闻 网索引准备PUT /shop {"settings": {"number_of_shards": 5,"number_of_replicas": 0} } POST /shop/_mapping {"properties": {"id": {"type": "long&qu…

JavaSE_第8章 异常(尚)

JavaSE_【异常】 主要内容 异常的体系结构常见异常throw关键字&#xff08;手动创建并抛出异常&#xff09;异常处理机制一&#xff1a;try&#xff08;掌握&#xff09;异常处理机制二&#xff1a;throws&#xff08;掌握&#xff09;自定义异常 学习目标 能够辨别程序中异…

03-Elasticsearch-基本语法

查询[ES] 查询ES信息GET /查询集群健康状态GET /_cluster/health增删改索引 创建索引并指定主分片和副本数PUT /my_doc {"settings": {"number_of_shards": 1,"number_of_replicas": 0} }创建索引并指定映射PUT /index_mappings {"mappings…

Redis详解

Redis介绍1.Redis 是一个基于内存的高性能 key-value 数据库。是完全开源免费的,用C语言编写的,遵守BSD协议2.Redis 特点:1)Redis 是基于内存操作的,吞吐量非常高,可以在 1s内完成十万次读写操作      2)Redis 的读写模块是单线程,每个操作都具原子性      …

图的遍历 —— 广度优先遍历

与树的遍历类似&#xff0c;图的遍历指从图的某一节点出发&#xff0c;按照某种搜索方式对图中的所有节点都仅访问一次。图的遍历可以解决很多搜索问题&#xff0c;实际应用非常广泛。图的遍历根据搜索方式的不同&#xff0c;分为广度优先遍历和深度优先遍历。 图的遍历 —— 广…

PATHWAYS: ASYNCHRONOUS DISTRIBUTED DATAFLOW FOR ML论文阅读笔记

PATHWAYS: ASYNCHRONOUS DISTRIBUTED DATAFLOW FOR ML 针对机器学习的异步分布式数据流阅读笔记 B站李沐视频讲解&#xff1a;Pathways-论文精读-李沐 摘要 ​ 本篇论文介绍了用于加速器的新的大规模的编排层orchestration layer的设计——Pathways。论文新型异步分布式数据…

Redis 缓存穿透, 缓存击穿, 缓存雪崩的解决方案与布隆过滤器

缓存穿透解决方案 设置空值布隆过滤器优点可以将存在的缓存, 位置设置为1, 然后当不存在的参数过来的时候, 会匹配到0上,这样就会直接返回不存在缺点存在错误判断, hash冲突 删除缓存时无法删除指定的1的位置, 应为存在多数据,同一hash, 所以无法删除 增加开发成本, 维护成本提…

线段树的基本操作

一 基本概念 线段树是一种基于分治思想的二叉树&#xff0c;它的每个节点对应一个[L,R]区间,叶子节点的区间 LR。每个非叶子节点[L,R]的左孩子区间为&#xff3b;L,(LR)/2]&#xff0c;右孩子区间为&#xff3b;(LR)/2,R]。[1,10] 区间的线段树如下。 二 线段树的存储方式 对…

初识ansible和ad-hoc

基本环境要求&#xff1a; 管理节点 被管理节点 openssh openssh python > 2.6 python >2.4 ansible 安装ansible 用最简单的方式进行安装 环境 CentOS Linux release 7.3.1611 内核版本&#xff1a; 3.10.0-514.el7.x86_64 centos7 需要联网 yum install epel-relea…

【ACM-ICPC】NEERC-2017(Clone Contest)

【ACM-ICPC】NEERC-2017(Clone Contest)A. Auxiliary Project (思维贪心)K. Kotlin Island (找规律构造)B. Boolean Satisfiability (逻辑或的性质)C. Consonant Fencity (下标映射二进制枚举构造)I. Intelligence in Perpendicularia(学霸题)简单记录一下比赛中AC的题目和思路…

Android Camera性能分析 - 第21讲 录像Buffer Path详解

本讲是Android Camera性能分析专题的第21讲 ​&#xff0c;我们介绍录像Buffer Path详解&#xff0c;包括如下内容&#xff1a; Android Codec2 简介Video Codec MediaRecorder.getSurface 录像Buffer PathVideo Codec2 MediaRecorder.getSurface 录像Buffer PathVideo Code…

【吴恩达深度学习】——NLP和Word Embedding

NLP和词嵌入思维导图词汇表征one-hot表征特征表征&#xff1a;词嵌入使用word Embeddings命名实体识别的例子&#xff1a;词嵌入的迁移学习&#xff1a;词嵌入和人脸编码词嵌入的特性类比推理的特性相似度函数&#xff1a;嵌入矩阵学习词嵌入其它的上下文和目标词对Word2VecSki…

C++ -------- 类型转换

目录 1.C语言中的类型转换 2.为什么C需要四种类型转换 3.C强制类型转换 (1)static_cast (2)reinterpret_cast (3)const_cast (4)dynamic_cast 4.explicit 5.RTTI 6.常见测试题 1.C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0…

MATLAB APP Desinger 使用方法介绍(下)---开发技巧常用示例补充整理以及app文件的发布和部署方法

本系列文章主要介绍使用MATLAB APP Desinge进行app或者说GUI界面开发的方法介绍&#xff0c;包括&#xff08;上&#xff09;和&#xff08;下&#xff09; 两篇文章&#xff0c;上篇中主要介绍常用的GUI组件的使用方法&#xff0c;下篇是对上篇的补充&#xff0c;主要介绍开发…

计算机网络原理(三):运输层

运输层服务 多路复用与多路分解 无连接运输:UDP 可靠数据传输原理 面向连接的运输:TCP 拥塞控制原理及TCP拥塞控制 一、运输层服务 1.1运输层服务 运 输层协议为运行在不同主机上的应用进程之间提供了逻辑通信(logic communica-tion)功能,从应用层的角度看,通过逻辑通信,运…

Docker镜像加速器的配置

目录 一、登录阿里云 1.1、点击右上角的控制台 1.2、再点击左上角​编辑 1.3、点击容器镜像服务 1.4、点击镜像工具&#xff0c;选择镜像加速器 1.5、加速器地址 1.6、选择自己使用的linux 二、配置镜像加速器 2.1、创建/etc/docker目录 2.2、配置镜像加速器 2.3、激…

谷粒学院16万字笔记+1600张配图(十七)——课程支付

项目源码与所需资料 链接&#xff1a;https://pan.baidu.com/s/1azwRyyFwXz5elhQL0BhkCA?pwd8z59 提取码&#xff1a;8z59 文章目录demo17-课程支付1.分析1.1两种情况1.2免费1.3收费2.新建订单微服务2.1创建子子模块service_order2.2创建数据表2.3生成代码2.4配置application.…

H3C设备全网通

【实验要求】 1、根据拓扑配置网络地址&#xff0c;实现全网通 2、在server上配置Telnet 3、AB能访问Internet , CD不能访问 4、CD能访问server, AB不能访问 【实验步骤】 1、各PC: 设置ip 设置默认路由&#xff08;吓一跳为网关&#xff09; 用路由器代替PC&#xff0c;[H3…