【Java】ArrayList底层源码分析

news/2024/5/10 7:41:56/文章来源:https://blog.csdn.net/qq_39757593/article/details/126904449

ArrayList底层源码分析

**先上结论:**ArrayList如果传入的参数为空,那么会在第一次添加的时候初始化容量为10,添加满后会按1.5倍扩容。如果传入的参数为8,则初始化容量大小为8,添加满后再次扩容一样会按1.5倍扩容。ArratList是线程不安全的,可以存入null,存入顺序有序,可重复,底层使用的数组实现。

1.测试代码

ArrayList list = new ArrayList();
//使用 for 给 list 集合添加 1-10 数据
for (int i = 1; i <= 10; i++) {list.add(i);
}
//使用 for 给 list 集合添加 11-15 数据
for (int i = 11; i <= 15; i++) {list.add(i);
}
list.add(100);
list.add(200);
list.add(null);

我们就以上面的代码为以进行分析debug。

打开Idea

2.设置断点

在这里插入图片描述

我们在不同的三处给list添加元素打上断点。

为什么在这三处打上断点?

原因

断点1会有第一次扩容为10

断点2会有第二次扩容为15

断点3会有第三次扩容为22

这三个断点会有三次扩容,所以会打这三个断点

3.debug分析

第一个断点分析

在这里插入图片描述

可见在第一个断点处i等于1,list还未进行扩容操作

我们强制进入add方法内部。

在这里插入图片描述

在这里插入图片描述

可以见到这里有一个ensureCapacityInternal方法,翻译过来的意思是确保内部容量传入的参数是size+1。size是内部的参数这里的参数为0,因为第一次添加,加一过后就是传入的参数为1了。

我们继续进入这个方法看

在这里插入图片描述

变量名含义
elementData是ArrayList维护的一个数组,也是最核心的数组用于帮助ArrayList存入数据。
DEFAULTCAPACITY_EMPTY_ELEMENTDATA是ArrayList维护的一个空数组
DEFAULT_CAPACITY是ArrayList维护的常量,意思是默认的容量大小

elementData数组容量为空,则在DEFAULT_CAPACITYminCapacity选出最大值并赋值给minCapacity

这里的DEFAULT_CAPACITY等于10,minCapacity等于1,所以minCapacity被赋值为10。

继续调试进入ensureExplicitCapacity方法

在这里插入图片描述

变量含义
modCount记录修改次数,集合源码中存在这个modCount变量时,基本上可以说明这个类是线程不安全的
elementData.length当前集合容量大小

当minCapacity大于当前集合容量大小则执行grow方法也就是进行扩容操作我们进入grow方法

在这里插入图片描述

变量含义
MAX_ARRAY_SIZEInteger.MAX_VALUE-8

我们将当前集合容量大小存入oldCapacity变量中,再将oldCapacity的1.5倍存入newCapacity中。当newCapacity小于minCapacity则newCapacity赋值为minCapacity也就是10。最后使用Arrays.copyOf进行扩容。

好了ensureCapacityInternal里面的方法分析完毕

进行下一步赋值

在这里插入图片描述

size++当前容量加一,elementData[0]=e。将元素e赋值给elementData下标为一。

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

返回add方法,此时可以看到elementData大小扩容到10,下标为0赋值为1。

我们执行完这个for循环,进入下一个断点。

在这里插入图片描述

第二个断点分析

在这里插入图片描述

这里的size为10,加1后为11传入ensureCapacityInternal方法中

在这里插入图片描述

此时elementData是不为空且有元素所以不执行if里面的语句,直接进行ensureExplicitCapacity方法

在这里插入图片描述

此时传入的参数minCapacity大于elementData.length大小进行扩容

在这里插入图片描述

将elementData容量扩容原来的1.5倍赋值给newCapacity。newCapacity大于minCapacity所以不执行if里的赋值操作,直接将elementData扩容到原来的1.5倍也就是容量为15

ensureCapacityInternal方法执行完毕回到add方法

在这里插入图片描述

elementData[10]=11

返回add方法,此时可以看到elementData大小扩容到15,下标为10赋值为11。

在这里插入图片描述

断点二分析完毕。

第三个断点和第二个断点扩容几乎一致,集合扩容到原来的1.5倍也就是22。这里不再赘述。

此文到此结束。

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

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

相关文章

基于html+node的文化资讯网站设计

1 引言 4 1.1 课题背景 4 1.2课题意义 4 2相关技术简介 6 2.1 html技术 6 2.2 css技术 6 2.3 JavaScript 6 2.4 JQuery 6 2.5 Vue 7 2.6 MySQL技术 7 2.7 node.js技术 7 3需求分析 8 3.1 系统功能 8 3.2 系统开发环境 8 3.3功能性需求分析 8 3.3.1用户系统 8 3.3.2 文章系统 8 …

【leetcode】【2022/9/16】850. 矩形面积 II

问题描述&#xff1a; 我们给出了一个&#xff08;轴对齐的&#xff09;二维矩形列表 rectangles。 对于 rectangle[i] [x1, y1, x2, y2]&#xff0c;其中 (x1&#xff0c;y1) 是矩形 i 左下角的坐标&#xff0c;(xi1, yi1) 是该矩形左下角的坐标&#xff0c; (xi2, yi2) 是该…

C语言函数递归调用

1、函数递归调用的定义 递归函数定义&#xff1a;一个函数在 自己的函数体内 调用自己&#xff1b;执行递归函数将反复调用其自身&#xff0c;每调用一次就有一个新层 #include<stdio.h> // 函数声明 void diguifunc(); int main() //主函数 {diguifunc(); //运行后…

常用的软件架构

MVC 架构 MVP 架构 MVVM 架构 网上的一些常用架构解释图:MVC架构MVP架构

Haproxy 透传IP配置方法及测试

Haproxy 透传IP配置方法1. 环境准备2. 测试准备2.1 启动Haproxy容器方法2.1.1 拉取官方haproxy镜像2.1.2 删除旧的容器2.1.3 编写haproxy配置2.1.4 运行配置检查2.1.5 启动容器2.1.6 更改配置2.2 Golang Server编写2.2.1 TCP Server2.2.2 HTTP Server2.3 客户端测试2.3.1 设置网…

关于VC++运行库报错

Microsoft Visual C&#xff08;简称Visual C、MSVC、VC或VC&#xff09;是微软公司的C开发工具&#xff0c;具有一体化开发环境&#xff0c;可提供编辑 C语言&#xff0c;C以及C/CLI等程式语言。 VC集成了便利的调试工具&#xff0c;特别是整合了微软Windows窗口操作系统应用程…

家用网络常识

目前家庭使用的网速一般 运营商 销售的宽带,会说 50M 100M 200M 300M 这个 100M 指的就是 100M bit/s,而我们都知道 8bit相当于一个字节,也就是1B,所以换算成字节,其实是 12.5M B/s,也就是12.5M,12.5兆换算关系 1 KB = 1024 B 1 MB = 1024 KB 1 GB = 1024 MB 1 TB = 102…

联邦学习开源框架方案选型

无知者&#xff1a;【联邦学习开源框架】FedLab - 加速FL算法验证 联邦学习开源框架FedLab相关 FATE 单位&#xff1a;微众银行 github: https://github.com/FederatedAI/FATE star&#xff1a;3.2k docs&#xff1a;https://github.com/FederatedAI/FATE/blob/master/doc…

电力系统中新型预测双二元变量机组组合问题(Matlab代码实现)

目录 1 概述 2 Matlab代码实现 3 参考文献 1 概述 高效求解大规模 SCUC 问题的关键在于削减其规模。文献[1]表明&#xff0c;安全约束机组组合问题中 大量的故障态安全约束是冗余且无效的&#xff0c;不会对SCUC 问题的最优解产生影响。因此&#xff0c;可以通过辨 识、删除…

为什么ArrayList的subList结果不能转换为ArrayList????

subList是List接口中的一个方法,该方法主要返回一个集合中的一段子集,可以理解为截取一个集合中的部分元素,它的返回值也是一个List。 让我们初始化一个例子:import java.util.ArrayList; import java.util.List;public class SubList_demo {public static void main(Strin…

OPTEE:CA-TA会话的创建(二)

前言 在上一篇我们知道TA是什么&#xff0c;以及为什么需要加载TA。这里来写写加载TA后&#xff0c;怎么CA和TA&#xff0c;TA和TA怎么建立会话&#xff0c;实现我们的功能的。 参考内容全部来自《手机安全和可信应用开发指南》&#xff0c;少有OPTEE书籍&#xff0c;感恩前辈…

牛客网-SQL专项训练15

①MySQL是一种(关系型)数据库管理系统。 关系型数据库的代表包括Oracle, Sql Server, MySQL。 ②小李在创建完一张数据表后,发现少创建了一列,此时需要修改表结构,应该用哪个语句进行操作?C 解析: 题目中说了需要修改表的结构, 故需要使用alter table 添加列: ALTER T…

大数据技术分享 - 话题挑战跳大开团

CSDN话题挑战赛第2期 参赛话题&#xff1a;大数据技术分享 大数据技术分享 - 话题挑战跳大开团 文章目录大数据技术分享 - 话题挑战跳大开团一、披挂上阵【老将出马】1. 历史战绩2. 再战江湖二、先手跳大【勇于开团】1. 个人经历2. Buff自取三、兵精粮足【底蕴深厚】1. 写作模…

QT串口助手-ZUA课设

QT串口助手成品展示QT全部程序构成zua.proserial.hmain.cppserial.cppserial.uiKeil全部程序构成main.cstm32f10x_conf.hstm32f10x_it.c5.stm32f10x_it.hbsp_usart.cbsp_led.cbsp_exit.cbsp_dht11.cbsp_delay.c介绍硬件野火F103指南者DHT11温湿度传感器QT全部程序构成QT设计的思…

虚拟机中centos扩展根目录空间

文章目录一、在vmware上为centos扩展存储二、在centos上扩充在进行yum安装软件时&#xff0c;由于空间不足一直提示“文件系统根目录上从磁盘空间不足”一、在vmware上为centos扩展存储 二、在centos上扩充 运行 df -h 查看容量情况&#xff0c;发现新扩展的空间并没有加载上。…

Babel 插件:30分钟从入门到实战

动手点关注 干货不迷路 &#x1f447;Babel 是一个 source to source&#xff08;源码到源码&#xff09;的 JavaScript 编译器&#xff0c;简单来说&#xff0c;你为 Babel 提供一些 JavaScript 代码&#xff0c;Babel 可以更改这些代码&#xff0c;然后返回给你新生成的代码。…

LeetCode程序员面试金典(第 6 版)上

目录 面试题 01.01. 判定字符是否唯一 面试题 01.03. URL化 面试题 01.04. 回文排列 面试题 01.05. 一次编辑 面试题 01.06. 字符串压缩 面试题 01.07. 旋转矩阵 面试题 01.08. 零矩阵 面试题 01.09. 字符串轮转 面试题 02.01. 移除重复节点 面试题 02.02. 返回倒数第…

BI测试

关于BI测试 前言:由于之前做过一段时间大数据测试,故整理BI测试知识点以供学习。BI测试: BI是从数据接入、数据准备、数据分析、数据可视化到数bai据分发应用的一系列过程,目的是为了辅助企业高效决策。而报表虽然最终也实现了数据可视化,但是对于数据分析的维度、深度、颗…

【数据结构与算法】排序(下篇)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《数据结构与算法》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 排序⚽归并排序⚾递归实现⚾非递归实现⚽常见排序算法的复杂度和稳定性分析⚾稳定性⚾具体分…

docker安装mysql(单体)

docker安装mysql mac的m1芯片上不支持5.7版本的镜像&#xff0c;因此可以直接选择拉取8.0及之后的版本 docker pull mysql创建mysql的宿主机数据卷挂载的文件夹 # mysql的配置文件&#xff0c;注意conf.d文件夹必须要创建&#xff0c;否则启动容器的时候&#xff0c;数据卷 …