Vector部分底层源码解析

JDK版本为1.8.0_271,Vector底层也是使用object数组,但使用synchronized 关键字来确保线程安全,但效率比ArrayList低,比较少见。这里以插入删除元素为例:

//属性
protected Object[] elementData;
protected int elementCount;//构造器
public Vector() {this(10); //指定初始容量initialCapacity为10
}public Vector(int initialCapacity) {this(initialCapacity, 0); //指定capacityIncrement增量为0
}public Vector(int initialCapacity, int capacityIncrement) {super();//判断了形参初始容量initialCapacity的合法性if (initialCapacity < 0)throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);//创建了一个Object[]类型的数组this.elementData = new Object[initialCapacity];//增量,默认是0,如果是0,后面就按照2倍增加,如果不是0,后面就按照你指定的增量进行增量this.capacityIncrement = capacityIncrement;
}//方法:add()相关方法
//synchronized意味着线程安全的   
public synchronized boolean add(E e) {modCount++;//看是否需要扩容ensureCapacityHelper(elementCount + 1);//把新的元素存入[elementCount],存入后,elementCount元素的个数增1elementData[elementCount++] = e;return true;
}// 如果需要扩容的话会进行扩容
private void ensureCapacityHelper(int minCapacity) {//看是否超过了当前数组的容量if (minCapacity - elementData.length > 0)grow(minCapacity); //扩容
}// 扩容
private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length; //获取原有数组的长度//如果capacityIncrement增量是0,新容量 = oldCapacity的2倍//如果capacityIncrement增量是不是0,新容量 = oldCapacity + capacityIncrement增量;int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);//如果按照上面计算的新容量还不够,就按照需要的最小容量来扩容minCapacityif (newCapacity - minCapacity < 0)newCapacity = minCapacity;//如果新容量超过了最大数组限制(Integer.MAX_VALUE - 8),那么单独处理if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);//把旧数组中的数据复制到新数组中,新数组的长度为newCapacityelementData = Arrays.copyOf(elementData, newCapacity);
}// 新容量超过了最大数组限制(Integer.MAX_VALUE - 8;),需要进行调整
private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflowthrow new OutOfMemoryError();// 对minCapacity和MAX_ARRAY_SIZE进行比较// 若minCapacity大,将Integer.MAX_VALUE作为新数组的大小// 若MAX_ARRAY_SIZE大,将MAX_ARRAY_SIZE作为新数组的大小// MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;
}
------
著作权归JavaGuide(javaguide.cn)所有
基于MIT协议
原文链接:https://javaguide.cn/java/collection/arraylist-source-code.html//方法:remove()相关方法
public boolean remove(Object o) {return removeElement(o);
}
// 移除元素
public synchronized boolean removeElement(Object obj) {modCount++;//查找obj在当前Vector中的下标int i = indexOf(obj);//如果i>=0,说明存在,删除[i]位置的元素if (i >= 0) {removeElementAt(i);return true;}return false;
}//方法:indexOf(),查找元素
public int indexOf(Object o) {return indexOf(o, 0);
}
public synchronized int indexOf(Object o, int index) {if (o == null) {//要查找的元素是null值for (int i = index ; i < elementCount ; i++)if (elementData[i]==null)//如果是null值,用==null判断return i;} else {//要查找的元素是非null值,防止NullPointerExceptionfor (int i = index ; i < elementCount ; i++)if (o.equals(elementData[i]))//如果是非null值,用equals判断return i;}return -1;
}//方法:removeElementAt(),移除index位置的元素
public synchronized void removeElementAt(int index) {modCount++;//判断下标的合法性,必须在[0,elementCount)合法区间内if (index >= elementCount) {throw new ArrayIndexOutOfBoundsException(index + " >= " +elementCount);}else if (index < 0) {throw new ArrayIndexOutOfBoundsException(index);}//j是要移动的元素的个数int j = elementCount - index - 1;//如果需要移动元素,就调用System.arraycopy进行移动if (j > 0) {//把index+1位置以及后面的元素往前移动//index+1的位置的元素移动到index位置,依次类推//一共移动j个System.arraycopy(elementData, index + 1, elementData, index, j);}//元素的总个数减少elementCount--;//将elementData[elementCount]这个位置置空,用来添加新元素,位置的元素等着被GC回收elementData[elementCount] = null; /* to let gc do its work */
}

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

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

相关文章

Linux之bpfjit(2)使用分析和mini-tcpdump实现

Linux之bpfjit(2)使用分析和mini-tcpdump实现 Author: Once Day Date: 2024年4月13日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可以参考专栏&#xff1a;…

idea 使用springboot helper 创建springboot项目

Spring Boot Helper 是一个在 IntelliJ IDEA 中用于快速创建 Spring Boot 项目的插件。通过这个插件&#xff0c;开发者可以简化 Spring Boot 项目的创建过程&#xff0c;并快速生成所需的依赖和配置文件。以下是使用 Spring Boot Helper 插件创建 Spring Boot 项目的详细步骤&…

Docker搭建Dillinger

Dillinger是一款功能强大的在线Markdown编辑器&#xff0c;它支持实时预览、导出至各种格式、多种主题等功能。通过Docker&#xff0c;我们可以轻松地部署和运行Dillinger&#xff0c;从而实现在线Markdown编辑与预览。本教程将分别介绍使用Docker CLI和Docker Compose两种不同…

QT windeployqt打包出现无法正常启动问题

QT 通过windeployqt 打包后出现的问题 原因QT构建选择的是64位的 但是windows下运行的却是32位的 步骤打开32的所在路径 一般在上一级目录会有安装好的64位的MSVC工具 运行打包即可

《乱弹篇(27)回乡祭扫感慨多》

人老了&#xff0c;真的就要记住“好汉不提当年勇&#xff0c;梅花不提前世绣”这话。 忆往昔&#xff0c;中青年时代的笔者精力旺盛&#xff0c;也曾只身一人闯荡江湖&#xff0c;把自己的足迹印到过大半个中国土地上&#xff0c;可如今岁近耄耋残年&#xff0c;清明节想回一…

Python | Leetcode Python题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; class Solution:def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:dummy ListNode(0, head)first headsecond dummyfor i in range(n):first first.nextwhile first:first first.nextsecond second.nextsecond.ne…

gemini1.5 API调用

https://ai.google.dev/pricing?hlzh-cn 查询可用的model https://generativelanguage.googleapis.com/v1beta/models?keyxxx 使用postman调用 https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent?keyxxx https://ai.google…

聊一下HashMap的底层原理

HashMap作为我们熟悉的一种集合&#xff0c;今天就来聊一下它的原理、数据结构。 1.HashMap的数据结构 JDK1.7的数据结构是数组链表&#xff0c;JDK1.7还有人在用&#xff1f;不会吧…… 说一下JDK1.8的数据结构吧&#xff1a; JDK1.8的数据结构是数组链表红黑树。 数据结…

重发布和路由策略

重发布&#xff08;重分布/重分发&#xff09;&#xff1a; 当一个网络内&#xff0c;存在多种路由协议时&#xff0c;或同一协议多个进程时&#xff1b;每种协议或进程&#xff0c;均独立运行&#xff0c;不共享数据&#xff1b;只能通过重发布技术实现全网可达&#xff1b; …

Vue pdfjs

最终效果图 官网 https://mozilla.github.io/pdf.js 下载 放入项目 vue页面嵌入本地下载好的html sessionStorage.setItem(sdfDldj8KJ45SDF, encodeURIComponent(file_url)) <template><div style"height:100%"><iframe:id"1":key"…

阿里云服务器租用费用,这价格可以呀!

2024阿里云服务器租用优惠价格4月最新报价&#xff0c;阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M服务器108元一年、香港30M带宽轻量服务器24元1个月、云服务器4核16G10M带宽30元1个月、90元3个月&#xff0c;云…

【数据分享】中国首套1米分辨率土地覆盖数据(2023年发布)

土地覆盖数据是我们在各项研究中都非常常用的数据&#xff01;本次我们整理的是全国各城市的1米分辨率的土地覆盖数据&#xff01; 武汉大学李卓鸿、何伟等研究者基于深度学习框架和开放数据&#xff0c;具体包括全球土地覆盖&#xff08;GLC&#xff09;数据、OSM地图数据、谷…

每日两题 / 3. 无重复字符的最长子串 84. 柱状图中最大的矩形(LeetCode热题100)

3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 双指针&#xff0c;l和r从字符串最左边开始&#xff0c;保存l和r之间的所有字符 移动r&#xff0c;若新加入的字符和已有字符重复&#xff0c;则不断移动l&#xff0c;直到l和r之间不出现重复字符 注意&#…

【机器学习】深入剖析贝叶斯算法原理及其广泛应用

一、引言 在机器学习的广阔领域中&#xff0c;贝叶斯算法以其独特的概率推理方式占据了重要的地位。它不仅为分类问题提供了有效的解决方案&#xff0c;还在自然语言处理、信息检索、垃圾邮件过滤等诸多领域发挥着不可替代的作用。 贝叶斯算法的基本思想源于贝叶斯定理&#xf…

数据结构学习之路--实现带头双向循环链表的详解(附C源码)

嗨嗨大家~本期带来的内容是&#xff1a;带头双向循环链表的实现。在上期文章中我们提到过带头双向循环链表&#xff0c;那么它的实现又是怎样的呢&#xff1f;今天我们来一探究竟&#xff01; 目录 前言 一、认识带头双向循环链表 1 认识双向链表 2 带头双向循环链表的定…

Oracle获取对象的DDL创建语句

1.命令行方式&#xff08;如&#xff1a;sqlplus&#xff09; ## 用户 select dbms_metadata.get_ddl(USER,TEST) from dual;## 表 select dbms_metadata.get_ddl(TABLE,TEST,T1) from dual;## 表空间 select dbms_metadata.get_ddl(TABLESPACE,TBS_NAME) from dual;## 索引 s…

【教学类-50-06】20240410“数一数”4类星号图片制作PDF学具

作品展示&#xff1a; 背景需求&#xff1a; 前文遍历四个文件夹&#xff0c;分别将每个文件夹内的10个图片的左上角加入星号&#xff0c;显示难度系数 【教学类-50-05】20240410“数一数”4类图片添加“难度星号”-CSDN博客文章浏览阅读55次&#xff0c;点赞2次&#xff0c;…

Linux: softirq 简介

文章目录 1. 前言2. softirq 实现2.1 softirq 初始化2.1.1 注册各类 softirq 处理接口2.1.2 创建 softirq 处理线程 2.2 softirq 的 触发 和 处理2.1.1 softirq 触发2.1.2 softirq 处理2.1.2.1 在 中断上下文 处理 softirq2.1.2.2 在 ksoftirqd 内核线程上下文 处理 softirq 3.…

麒麟系统(kylin)安装ssh后,无法上传文件

1.赋予文件夹权限 chmod 777 filename 2.修改ssh配置文件 vi /etc/ssh/sshd_config 将Subsystem sftp /xxxxx 改为Subsystem sftp internal-sftp 重启服务 sudo service sshd restart 断开ssh连接&#xff0c;重新连接&#xff0c;即可正常上传文件

深度解析基数排序:原理、实现与应用场景

基数排序是一种非比较型排序算法&#xff0c;它巧妙地利用数字的每一位进行独立排序&#xff0c;从而实现整体序列的有序排列。本文将深入探讨基数排序的原理、具体实现过程&#xff0c;以及其性能特点和适用场景&#xff0c;帮助读者全面认识这一独特且高效的排序方法。 一、…