【底层学习】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/497738.html

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

相关文章

仿真科普|CAE技术赋能无人机 低空经济蓄势起飞

喝一杯无人机送来的现磨热咖啡;在拥堵的早高峰打个“空中的士”上班;乘坐水陆两栖飞机来一场“陆海空”立体式观光……曾经只出现在科幻片里的5D城市魔幻场景,正逐渐走进现实。而推动上述场景实现的,就是近年来越来越热的“低空经…

webstorm 创建vue3 vite 项目

打开Webstorm,创建一个空项目 直接在当前项目执行创建vue3项目指令,打开主页terminal 回车后输入项目名字全部小写字母字 打开创建项目 项目插件安装 npm install 运行: npm run dev

如何调用GLM-4 API实现智能问答

诸神缄默不语-个人CSDN博文目录 GLM系列大模型是智谱AI提供的系列语言模型,GLM-4没有开源,只提供了API。本文介绍如何用Python语言调用GLM-4 API实现智能问答。 智谱AI为所有用户提供了18元免费额度,可以试用。 文章目录 1. 获得API key2. …

Qt|QTreewidget类下函数qt助手详解说明示例(上)

该系列持续更新,喜欢请一键三连,感谢各位大佬。 QT5.14.2 参考官方QT助手 文章目录 QTreeWidget ClasspropertiesPublic Functions默认构造函数默认析构函数添加根节点void addTopLevelItem(QTreeWidgetItem *item)添加多个根节点void addTopLevelItems…

强化学习Agent系列(二)——PyGame虚拟环境创建与Python 贪吃蛇Agent制作实战教学

文章目录 一、前言二、gymnasium 简单虚拟环境创建1、gymnasium介绍2、gymnasium 贪吃蛇简单示例 三、基于gymnasium创建的虚拟环境训练贪吃蛇Agent1、虚拟环境2、虚拟环境注册3、训练程序4、模型测试 三、卷积虚拟环境1、卷积神经网络虚拟环境2、训练代码 一、前言 大家好&am…

C++重点---STL简介

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、STL简介 STL(Standard Template Library)是C标准库中的一个重要组成部分,它提供了…

Flutter Dio进阶:使用Flutter Dio拦截器实现高效的API请求管理和身份验证刷新

Flutter笔记 使用Flutter Dio拦截器实现高效的API请求管理和身份验证刷新 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article…

js 面试 什么是WebSockets?HTTP和HTTPS有什么不同?web worker是什么?

概念: webSocket 是一种在客户端和服务端之间建立持久连接的协议,它提供全双工通信通道,是服务器可以主动向客户端推送数据,同时也可以接受客户端发送的数据。 1 webSocket与https区别? 在网络通信中,We…

websocket在django中的运用

14-2 聊天室实现思路:轮训、长轮训、websocket_哔哩哔哩_bilibili 参考大佬的B站学习笔记 https://www.cnblogs.com/wupeiqi/p/6558766.html 参考博客 https://www.cnblogs.com/wupeiqi/articles/9593858.html 参考博客 http协议: 是短连接,无状态…

C#,双向链表(Doubly Linked List)归并排序(Merge Sort)算法与源代码

1 双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循…

vscode 设置打开终端的默认工作目录/路径

vscode 设置打开终端的默认工作目录/路径** 文章目录 vscode 设置打开终端的默认工作目录/路径**打开vscode,打开设置UI 或是设置JSON文件,找到相关设置项方式1:通过打开settings.json的UI界面 设置:方式2:通过打开设置settings.j…

linux系统-----------搭建LNMP 架构

PHP(Hypertext Preprocessor 超文本预处理器)是通用服务器端脚本编程语言,主要用于web开发实现动态web页面,也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可…