【底层解读】ArrayList源码学习

成员变量

学习源码前,我们还是先看一下ArrayList中成员变量有哪些

在这里插入图片描述

构造函数

ArrayList一共有三个构造函数。

第一个:带有指定初始容量的构造函数

在这里插入图片描述

第二个:空参构造

在这里插入图片描述

第三个:包含指定集合的构造函数

在这里插入图片描述

OK,看完构造函数,我们接下来看ArrayList的添加和扩容操作

添加和扩容

第 1 次添加数据

首先看下面构造函数:
在这里插入图片描述
调用空参构造,成员变量 size 此时为 0,一切都是默认。第一次添加元素,调用 add 方法,add 方法如下:
在这里插入图片描述
追踪 ensureCapacityInternal 方法,方法如下:
在这里插入图片描述
通过这里,可以得到 calculateCapacity 方法计算结果为 10,此时 10 会作为参数传给 ensureExplicitCapacity 方法,ensureExplicitCapacity 方法如下:
在这里插入图片描述
条件满足,调用 grow 扩容方法,方法实现如下:
在这里插入图片描述
int newCapacity = oldCapacity + (oldCapacity >> 1)这行代码说明了 Arraylist 底层扩容是以 1.5 倍扩容。然后扩容完毕之后,继续执行 add 方法中的elementData[size++] = e语句,即往数组大小为10的数组中,索引为 0 的下标下添加元素。size大小在计算完成后会自增。大佬这里可以帮我解释一下,这里不太懂。

第 2 到第 10 次添加数据

假如这是我们第 10 次添加数据,那么此时 add 方法中 size 肯定是为 9 的,对吧?第 10 次,那么前面是有 9 个数据了,所以 size 为 9。那么传递到 ensureCapacityInternal 方法中的参数就为 10
在这里插入图片描述
然后 minCapacity 就是 10,传递到 calculateCapacity 方法,得到结果还是为 10。具体可以参考上述(第一次添加元素的源码)源码比对分析一下。
接下来就是重点,ensureExplicitCapacity 这个方法此时 minCapacity=10,elementData.length=10(第一次添加元素的时候,就直接把 10 给了elementData.length),如下图所示:
在这里插入图片描述
所以 minCapacity - elementData.length 结果为 0,并没有大于 0,条件不成立,是不会进行扩容的。那么我们可以得出,在第 2 次到第 10 次的时候,都是不会进行扩容的。

第 11 次添加元素

第 11 次添加元素,说明之前已经存在了 10 个元素,那么就会进行扩容逻辑,以 1.5 倍进行扩容。

ArrayList 底层实现原理

ArrayList底层是用动态数组实现的,初始容量为 0,第一次扩容会初始化容量为 10,会以 1.5 倍进行扩容,每次扩容需要数组拷贝

ArrayList 和 LinkedList 区别是什么?

ArrayList 底层是动态数组,LinkedList 底层是双向链表
ArrayList 按照索引查询,LinkedList 不支持下标查询
ArrayList 节省内存,LinkedList占用空间
两者都不线程安全

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

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

相关文章

[算法沉淀记录] 排序算法 —— 堆排序

排序算法 —— 堆排序 算法基础介绍 堆排序(Heap Sort)是一种基于比较的排序算法,它利用堆这种数据结构来实现排序。堆是一种特殊的完全二叉树,其中每个节点的值都必须大于或等于(最大堆)或小于或等于&am…

The Grapes NFT 概览与数据分析

作者:stellafootprint.network 编译:cicifootprint.network 数据源:The Grapes NFT Collection Dashboard The Grapes 是一个有趣且具有吸引力的 NFT 收藏集合,包含 3,333 个精心制作的 NFT。这个 NFT 项目会在 2024 年再创高…

Docker Volume

"Ice in my vein" Docker Volume(存储卷) 什么是存储卷? 存储卷就是: “将宿主机的本地文件系统中存在的某个目录,与容器内部的文件系统上的某一目录建立绑定关系”。 存储卷与容器本身的联合文件系统? 在宿主机上的这个与容器形成绑定关系…

【自然语言处理三-自注意self attention】

自然语言处理三-自注意力 self attention 自注意力是什么?自注意力模型出现的原因是什么?词性标注问题解决方法1-扩展window,引用上下文解决方法2-运用seq2seq架构新问题来了:参数量增加、无法并行的顽疾 自注意力self attention模…

c入门第二十三篇: 学生成绩管理系统优化(支持远程操作)

前言 师弟高兴的说道:“师兄,你猜我今天上课看见谁了?” 我:“谁呢?” 师弟:“程夏,没想到,她竟然来旁听我们计算机系的课程了。虽然我从前门进去的,但是我还是一眼就看…

LDR6020双盲插音频随便插充电听歌随便插

随着智能手机的普及和功能的日益丰富,手机已经成为我们日常生活中不可或缺的一部分。音乐、电影、游戏等娱乐内容更是丰富了手机的使用体验。而在这其中,音频转接器的作用愈发凸显,特别是在边听边充的场景下,一款高效且便捷的手机…

【Docker】03 容器操作

文章目录 一、流转图二、基本操作2.1 查看本地容器进程2.2 启动容器2.2.1 交互式启动容器2.2.2 后台启动容器 2.3 进入容器2.4 停止启动重启容器2.5 退出容器2.6 删除容器2.7 提交容器(打包成镜像)2.8 拷贝文件2.8.1 拷贝容器内文件到宿主机2.8.2 拷贝宿…

学成在线_课程计划查询_前端页面无法跳转

问题描述 在进行课程计划查询的接口开发时通过了http-client测试但点开课程修改界面后点击保存并进行下一步时无法跳转到修改课程计划查询的页面。 问题原因 课程信息修改的Controller层没有实现 QAQ(可能是老师在讲这一块的时候没有提这一点(我也记…

C# paddlerocrsharp识别身份证号

https://gitee.com/raoyutian/paddle-ocrsharp 项目搭建 新建控制台项目 安装paddleocrsharp 下载训练好的模型 解压放到对应的文件夹中,都修改为如果较新则复制 编写代码OCRHelper.cs using PaddleOCRSharp;namespace OCRTest02;public class OCRHelper {//…

golang gin单独部署vue3.0前后端分离应用

概述 因为公司最近的项目前端使用vue 3.0,后端api使用golang gin框架。测试通过后,博文记录,用于备忘。 步骤 npm run build,构建出前端项目的dist目录,dist目录的结构具体如下图 将dist目录复制到后端程序同级目录…

Vue-3

自定义指令 全局注册指令 文件路径:src/main.js import Vue from vue import App from ./App.vue Vue.config.productionTip false// 全局注册指令 Vue.directive(myFocus, {// inserted 会在指令所在的元素,被插入到页面中时触发inserted(el) {el.f…

【postgresql】数据表id自增与python sqlachemy结合实例

需求: postgresql实现一个建表语句,表名:student,字段id,name,age, 要求:每次添加一个数据id会自动增加1 在PostgreSQL中,您可以使用SERIAL或BIGSERIAL数据类型来自动生成主键ID。以下是一个创建名为stude…