略读ArrayList源码

ArrayList是Java集合框架中的一部分,底层是通过数组实现的,可以动态增长和缩减。

一、首先看成员变量

  • 序列化ID定义。在Java中,如果一个类实现了Serializable接口,那么它的serialVersionUID就非常重要了。serialVersionUID用于确保类的版本兼容性,如果你修改了类的内容,但是serialVersionUID没有改变,那么你可以反序列化旧版本的类。
  @java.io.Serialprivate static final long serialVersionUID = 8683452581122892189L;
  • 通过空参构造方法创建对象后第一次添加元素之时的数组容量
 private static final int DEFAULT_CAPACITY = 10;
  • 通过有参构造方法传入初始长度为0时将其赋值给存储元素的数组elementData
    private static final Object[] EMPTY_ELEMENTDATA = {};
  • 通过空参构造方法创建对象后第一次添加元素之前的数组容量,为0,只有在第一次添加元素时才会将elementData的容量扩容到10;
 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
  • 集合元素实际的存储位置。有transient修饰是和序列化有关的,加了这一关键字后在序列化的时候就只序列化有用的数据
 transient Object[] elementData;
  • 记录集合的长度
  private int size;

二、构造方法

  • 首先看一下他这个空参构造方法:他将上面说到的一个空的数组赋值给存储集合元素的数组

  •  其次看一下传入一个初始长度的构造方法:其对初始长度做了一个判断,如果初始长度小于0,抛出异常,如果等于0,则将空数组赋值给elementData,大于0则创建一个长度为输入的初始长度的数组赋值给elementData。

 最后看一下传入一个集合的构造方法:首先将传入的集合转换为数组,将集合长度设置为转换的数组的长度,之后在做一个类型判断,获取传入集合的Class对象和ArrayList的Class对象作比较,看传入的集合是否为ArrayList类型,如果是就将该数组赋值给elementData,如果不是就做一个拷贝,该分支后面再说,如果传入的集合为空,则将空数组赋值给elementData,相当于传入一个数组长度为0的情况(上面已经说明)

上面所说的如果传入的集合不是ArrayList类型的情况,因为我们是略读,所以也就不深究了,它是调用了Arrays的一个方法:

 

三、常用方法解析

(一)、添加方法

首先看一下add()方法,先看一下直接传入元素的:第一个变量modCount变量用于跟踪ArrayList的结构性变化,‌如添加、‌删除元素等操作。‌每当ArrayList的结构发生变化时,‌modCount的值就会增加。‌此外,‌当使用迭代器遍历ArrayList时,‌迭代器会在初始化时记录当前的modCount值(‌expectedModCount)‌,‌并在遍历过程中检查modCount是否发生变化。‌如果modCount与expectedModCount不相等,‌说明在迭代过程中ArrayList的结构被其他线程修改过,‌此时迭代器会抛出ConcurrentModificationException,‌以快速失败(‌fail-fast)‌策略通知用户。‌这种机制确保了多线程环境下的数据一致性,‌避免了数据竞争条件。‌

 

上面方法体里面它调用了一个add的重载方法,下面看一下这个方法:s表示当前集合的长度,e表示要插入的元素,插入到elementData,首先判断是否需要扩容,如果不需要则直接添加,然后size+1;扩容稍后来看

 

最后再看一下传入了索引值和元素的add()方法,首先做了一个索引的合法性判断,修改记录++,定义一个变量s,声明一个数组变量,为s赋值等于集合的长度,将声明的数组变量指向存储集合元素的数组,并判断是否需要扩容,不需要则做一个数组的拷贝,改变插入位置后面的数组元素的索引

 

 (二)扩容方法

是否需要扩容,传入一个minCapacity(size+1)然后进行一系列判断,详解看图片说明,然后进行一个1.5倍的扩容

 扩容的内部实现,打不动了呀兄弟们,自己看着理解会,也理解理解我八~~

 

(三)删除方法

 

后面源码都比较简单,就不带大家过了,相信你把前面看懂了,后面的源码对你都是小意思~~~~ 

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

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

相关文章

python 图片爬虫记录

感谢大家的点赞。再补充一点。 对于这个 url https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEqB5nighYsMZE7kexaVNJfxy3OkRutNEKatksw9u5f-ckHNROLzFyx2Uty3zYWNEaeOmzsljGr3eARiDWaM9DM8G2hPuPf8uZP0NO3kNUCnM2Cjb3ZKtLhJDBwqeR4ElpJ7ID5_wIHGQ/s200 这个url最…

Python进阶 JSON数据,pyecharts制图

目录 json数据格式的转换 什么是json json本质 注意 pyecharts快速入门 画一个最简单的折线图 使用全局配置选项优化折线图 总结 json数据格式的转换 什么是json 一种轻量级的数据交换格式,可以按json指定的格式去组织和封装数据 json本质 带有特定格式的…

汇川技术|Inoproshop基本使用方法:汇川指令库、库文件

哈喽,你好啊,我是雷工! 本节熟悉了解汇川常用指令库的分类及概述,了解Inoproshop库文件; 以下为学习笔记。 01 指令简介与分类 可编程控制系统中,使CPU完成某种操作或实现某种功能的命令及多个命令的组合…

CCRC-DSA数据安全评估师:加快构建大网络安全工作格局

7月31日,第十二届ISC.AI互联网安全大会开幕式在北京国家会议中心隆重举行,本次大会以“构建大型安全防护模型,引领安全产业创新”为主题。 中央网络安全和信息化委员会办公室副主任、国家互联网信息办公室副主任王京涛出席并发表了重要讲话。…

语音平台调研

百度DuerOS开放平台 DuerOS是百度推出的对话式人工智能操作系统,即智能语音交互平台。DuerOS的技术架构包含“对话服务”和“技能框架”两大基础协议。两大协议连通起来的对话核心系统、智能设备开放平台和技能开放平台,构成了完整DuerOS的智能生态系统。…

C#初级——字典Dictionary

字典 字典是C#中的一种集合&#xff0c;它存储键值对&#xff0c;并且每个键与一个值相关联。 创建字典 Dictionary<键的类型, 值的类型> 字典名字 new Dictionary<键的类型, 值的类型>(); Dictionary<int, string> dicStudent new Dictionary<int, str…

Javascript常见算法(二)【学习】

动态规划 斐波那契数列&#xff1a; 经典的动态规划问题&#xff0c;每个数是前两个数的和。 斐波那契数列&#xff08;Fibonacci sequence&#xff09;是一个非常著名的数列&#xff0c;其中每个数是前两个数的和&#xff0c;序列以0和1开始。在JavaScript中&#xff0c;有多…

药厂子母钟系统,强抗干扰能力,满足复杂生产环境

在制药行业中&#xff0c;精确的时间同步对于确保药品生产的质量和合规性至关重要。药厂子母钟系统作为一种高度可靠的时间同步解决方案&#xff0c;不仅能够提供准确的时间信息&#xff0c;还具有强大的抗干扰能力&#xff0c;非常适合在复杂的生产环境中使用。本文将详细介绍…

[STM32]HAL库实现自己的BootLoader-BootLoader与OTA-STM32CUBEMX

目录 一、前言 二、BootLoader 三、BootLoader的实现 四、APP程序 五、效果展示 六、拓展 一、前言 听到BootLoader大家一定很熟悉&#xff0c;在很多常见的系统中都会存在BootLoader。本文将介绍BootLoader的含义和简易实现&#xff0c;建议大家学习前掌握些原理基础。 …

YOLOV8替换Lion优化器

YOLOV8替换Lion优化器 1 优化器介绍博客 参考bilibili讲解视频 论文地址&#xff1a;https://arxiv.org/abs/2302.06675 代码地址&#xff1a;https://github.com/google/automl/blob/master/lion/lion_pytorch.py """PyTorch implementation of the Lion …

C++初学(11)

不知不觉就第11篇了QWQ 11.1、指针和自由存储空间 之前提到了计算机程序在存储数据时必须跟踪的3个基本属性&#xff1a; &#xff08;1&#xff09;信息存储在何处&#xff1b; &#xff08;2&#xff09;存储的值为多少&#xff1b; &#xff08;3&#xff09;存储的信息…

未授权访问漏洞(非重点 中)

6.Hadoop 1.在 fofa 使用 port"8088" && app"Hadoop" 获取资源 2.打开后若无需登录,则存在漏洞 7.ActiveMQ 1.在 fofa 使用 body"ActiveMQ" && port"8161" 获取资源 2.打开后若点击登录,默认账户密码为 admin/adm…

【css】使用CSS绘制奥运五环--巴黎奥运

使用CSS绘制奥运五环 在2024年巴黎奥运会期间&#xff0c;本文来使用 CSS 来画一个奥运五环。奥运五环由五个相互交叠的圆环组成&#xff0c;分别代表五大洲。 奥运五环是相互连接的&#xff0c;因此在视觉上会产生重叠效果&#xff0c;这也是实现五环最有挑战性的部分 HTML结…

Rabbitmq的死信队列与如何利用死信队列实现延迟队列

如果设置了队列的 TTL 属性&#xff0c;那么一旦消息过期&#xff0c;就会被队列丢弃(如果配置了死信队列被丢到死信队列中)。而如果仅设置消息的 TTL 属性&#xff0c;即使消息过期&#xff0c;也不一定会被马上丢弃&#xff0c;因为消息是否过期是在即将投递到消费者之前判定…

HTML常用标签和CSS的运用

目录 1.HTML标签 1.1 文档结构标签 1.2 文本格式标签 1.3 列表标签 1.4 链接和媒体标签 1.5 表格标签 1.6 表单标签 1.7 分区和布局标签 1.8 元数据标签 2.css样式 2.1 字体样式 2.2 文本样式 2.3 背景样式 2.4 边框样式 2.5 间距样式 2.6 宽度和高度 2.7 显示…

AI算力租赁是什么,哪些行业会有需求?

一、AI算力租赁的定义与概述 AI算力租赁是指基于人工智能&#xff08;AI&#xff09;应用需求&#xff0c;将所需的计算能力&#xff08;即算力&#xff09;通过租赁服务的方式提供给企业和个人用户。这种服务允许用户根据需要租用人工智能计算资源&#xff0c;如图形处理单元…

星座运势网源码/星座屋接口/星座配对网站PHP程序带采集

星座运势网源码/星座屋接口/星座配对网站PHP程序带采集 演示站&#xff1a; https://xz.wengu8.com/ 程序说明&#xff1a; 1、前端模板PC手机端自适应。 2、每日运势/当月/当年星座运势调用星座屋API接口&#xff0c;每天只采集一次接口&#xff0c;后保存到本地调用本地…

科普文:万字梳理高性能 Kafka快的8个原因

概叙 科普文&#xff1a;万字详解Kafka基本原理和应用-CSDN博客 科普文&#xff1a;万字梳理31个Kafka问题-CSDN博客 我们都知道 Kafka 是基于磁盘进行存储的&#xff0c;但 Kafka 官方又称其具有高性能、高吞吐、低延时的特点&#xff0c;其吞吐量动辄几十上百万。 在座的…

Zookeeper未授权访问漏洞

Zookeeper是分布式协同管理工具&#xff0c;常用来管理系统配置信息&#xff0c;提供分布式协同服务。Zookeeper的默认开放端口是2181。Zookeeper安装部署之后默认情况下不需要任何身份验证&#xff0c;造成攻击者可以远程利用Zookeeper&#xff0c;通过服务器收集敏感信息或者…

TiDE时间序列模型预测(Long-term Forecasting with TiDE: Time-series Dense Encoder)

时间序列预测&#xff0c;广泛用于能源、金融、交通等诸多行业&#xff0c;传统的统计模型&#xff0c;例如ARIMA、GARCH等因其简单高效而被广泛使用&#xff0c;近年来&#xff0c;随着深度学习的兴起&#xff0c;基于神经网络的预测模型也备受关注&#xff0c;表现出强大的预…