【底层解读】ArrayList源码学习

news2024/12/24 11:30:57

成员变量

学习源码前,我们还是先看一下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.coloradmin.cn/o/1472370.html

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

相关文章

Numpy 数组添加行

参考:Add Row to Numpy Array 在机器学习和数据分析中,经常需要处理大型数据集。Numpy是Python中一个非常有用的库,它提供了高性能的多维数组对象以及用于处理这些数组的函数。在Numpy中,可以使用numpy.append()函数来添加行到一…

【Git教程】(三)提交详解 —— add、commit、status、stach命令的说明,提交散列值与历史,多次提交及忽略 ~

Git教程 提交详解 1️⃣ 访问权限与时间戳2️⃣ add命令与 commit 命令3️⃣ 提交散列值4️⃣ 提交历史5️⃣ 一种特别的提交查看方法6️⃣ 同一项目的多部不同历史6.1 部分输出:-n6.2 格式化输出:--format、--oneline6.3 统计修改信息:--st…

异常的处理

文章目录 1. 异常概述1.1 异常总结:1.2 什么是程序的异常1.3 异常的抛出机制1.4 如何对待异常 2. Java异常体系2.1 Error和Exception2.2 Throwable2.3 编译时异常和运行时异常 3. 常见的错误和异常3.1 Error3.2 运行时异常3.3 编译时异常 4. 异常的处理4.1 异常处理…

大好河山集团带医生的旅游团 守护旅客安康多年

回首大好河山集团成立之初,大好河山就秉持着对旅客安康的关切,怎么能让较高年龄的老人也能畅游祖国的大好河山,是大好河山集团迫切需要解决的问题,因此大好河山集团旗下部分旅游团设有带医生的旅游团为此类游客服务,他…

docker容器技术(2)

docker容器数据卷 什么是数据卷? 在Docker中,数据卷(Data Volumes)是一种特殊的目录,可以在容器和主机之间共享数据。它允许容器内的文件持久存在,并且可以被多个容器共享和访问。 数据卷的主要作用如下&am…

Pycharm 配置Django 框架

Pycharm 配置Django 框架 一、创建第一个django项目 先在自己所在盘创建一个文件夹”projectDjango“ 二、打开pycharm专业版,打开刚刚新建的“projectDjango”项目。 三、打开菜单栏“File"->“Settings” 选择自己安装的python版本 四、安装Django库 1.点…

浅浅的画一个STDP的图像吧

stdp最重要的是两个窗口函数 根据这个方程我们刻画出他的轨迹,代码如下 import numpy as np import matplotlib.pyplot as plt# 定义STDP参数 tau_pos 30 # 正向突触权重变化的时间常数 tau_neg 30 # 负向突触权重变化的时间常数 A_pos 0.1 # 正向突触权重变…

解决谷歌浏览器,每次重启都重置所有设置的问题

一、问题: 修改谷歌浏览器的设置 关闭浏览器再打开设置页面后,会显示(部分设置已重置Chrome检测到您的部分设置被其他程序篡改了,因此已将这些设置重置为原始默认设置。了解详情) 之前的设置被重置了 二、解决 创建—…

Python入门必学:print函数--从基础语法到高级用法

Python入门必学:print函数–从基础语法到高级用法 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 👈 希望得到您…

1.0 RK3399项目开发实录-Ubuntu环境搭建(物联技术666)

1.下载Ubuntu所需的版本:Index of /releases 2.安装vmplayer:Download VMware Workstation Player | VMware 3.安装Ubuntu时,磁盘空间尽量大些,开发板系统包都比较大,避免存不下,建议空间100G。 关闭Ubuntu自动更新…

MYSQL--(1.存储引擎 *2.事务*)

一 存储引擎: 1.介绍 1>在数据库管理系统当中通过使用数据引擎来实现数据的增删改,查询 2>不同的存储引擎提供的有不同的存储机制,索引技巧等功能 MYSQL的核心,就是存储引擎 3>同样的,用户也可以根据自己的需要进行选择,更改自己需要…

机器学习YOLO操作全流程​​编

YOLO介绍 Ultralytics YOLOv8,是最新的著名实时目标检测和图像分割模型。它基于深度学习和计算机视觉的最新进展,提供了无与伦比的速度和精度性能。由于其精简的设计,适用于各种应用,并且可以轻松适配不同的硬件平台,从边缘设备到云端API。 探索 YOLOv8 文档,这是一个全…

Unity类银河恶魔城学习记录7-9 P75 Saw spin sword源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill_Controller.cs using System.Collections; using System.Col…

数据可视化--了解数据可视化和Excel数据可视化

目录 1.1科学可视化: 可视化是模式、关系、异常 1.2三基色原理: 三基色:红色、绿色和蓝色 1.3Excel数据可视化 1.3.1 excel数据分析-13个图表可视化技巧 1.3.2 excel数据分析-28个常用可视化图表(video) 1.3.3Excel可视化…

DM数据库学习之路(十六)DEM部署DM8DPC集群

DEM部署DPC集群 DPC准备工作 在所有安装DPC服务器上部署dmagent,dmagent的运行环境需要依赖JAVA环境,JAVA版本必须为JAVA1.8。 创建用户 所有安装DPC服务器,手工建dmdba用户 # groupadd dinstall # useradd -g dinstall -d /home/dmdba…

PHP中的飞碟运算符、取反运算符、对比非ASCII字符串、对比浮点数操作

对比浮点数 在电脑里存储的浮点数可能会和输入的值有些许差异,比如输入的是10.0,但存储的是10.00001. 在比较两个浮点数是否相等时可以计算下两个数的差值,然后查看下两数之差是否小于可以接受的阈值,如果要求精度在小数点后5位的…

【Spring Boot 源码学习】深入 BootstrapContext 及其默认实现

《Spring Boot 源码学习系列》 深入 BootstrapContext 及其默认实现 一、引言二、往期内容三、主要内容3.1 BootstrapContext3.1.1 源码初识3.1.2 get 方法3.1.3 getOrElse 方法3.1.4 getOrElseSupply 方法3.1.5 getOrElseThrow 方法3.1.6 isRegistered 方法 3.2 ConfigurableB…

搜维尔科技:用于运动科学的 OptiTrack,范围标记、步态捕捉!

OptiTrack 系统提供世界领先的测量精度和简单易用的工作流程,为研究人员和生物力学师的研究提供理想的 3D 跟踪数据。 对所有主要数字测力台、EMG 和模拟设备的本机即插即用支持为研究人员提供了在 Visual3D、MotionMonitor、MATLAB 和其他第三方生物力学软件包中进…

leetcode有效的括号-中等

题目描述 解题思路 不要被事例骗到,没有事例中写的那么简单,其中还包括([ ])这种例子。如果是计算机本专业的同学来说,一眼看出来,需要使用栈的数据结构。在python中需要使用列表进行。如果匹配的是左括号…

这几个Python内置函数你都知道吗

divmod() divmod() 是一个 Python 内置函数,用于同时返回商和余数。它接受两个参数,第一个参数是被除数,第二个参数是除数,返回一个包含两个值的元组,第一个值是商,第二个值是余数。 示例用法如下&#…