【底层解读】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占用空间
两者都不线程安全

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

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

相关文章

Gemma谷歌(google)开源大模型微调实战(fintune gemma-2b)

Gemma-SFT Gemma-SFT(谷歌, Google), gemma-2b/gemma-7b微调(transformers)/LORA(peft)/推理 项目地址 https://github.com/yongzhuo/gemma-sft全部weights要用fp32/tf32, 使用fp16微调十几或几十的步数后大概率lossnan;(即便layer-norm是fp32也不行, LLaMA就没有这个问题, …

Open CASCADE学习|视图

目录 Mainwin.h Mainwin.cpp Mainwin.h ​#pragma once#include <QtWidgets/QMainWindow>#include "Displaywin.h"#include "OCC.h"class Mainwin : public QMainWindow{ Q_OBJECTpublic: Mainwin(QWidget* parent nullptr); ~Mainwin();​pri…

Python中高效的爬虫框架,你用过几个?

在信息时代&#xff0c;数据是无价之宝。许多开发者和数据分析师需要从互联网上采集大量的数据&#xff0c;用于各种用途&#xff0c;如分析、建模、可视化等。Python作为一门强大的编程语言&#xff0c;提供了多种高效的爬虫框架&#xff0c;使数据采集变得更加容易和高效。本…

IT资讯——全速推进“AI+鸿蒙”战略布局!

文章目录 每日一句正能量前言坚持长期研发投入全速推进“AI鸿蒙”战略 人才战略新章落地持续加码核心技术生态建设 后记 每日一句正能量 人总要咽下一些委屈&#xff0c;然后一字不提的擦干眼泪往前走&#xff0c;没有人能像白纸一样没有故事&#xff0c;成长的代价就是失去原来…

HashMap的put()方法执行流程

HashMap的数据结构在jdk1.8之前是数组链表&#xff0c;为了解决数据量过大、链表过长是查询效率会降低的问题变成了数组链表红黑树的结构&#xff0c;利用的是红黑树自平衡的特点。 链表的平均查找时间复杂度是O(n)&#xff0c;红黑树是O(log(n))。 HashMap中的put方法执行过…

机器视觉运动控制一体机在光伏汇流焊机器人系统的解决方案

一、市场应用背景 汇流焊是光伏太阳能电池板中段加工工艺&#xff0c;其前道工序为串焊&#xff0c;在此环节流程中&#xff0c;需要在多个太阳能电池片表面以平行方式串焊多条焊带&#xff0c;形成电池串。串焊好的多组电池串被有序排列输送到汇流焊接工作台&#xff0c;通过…

springboot+vue实现微信公众号扫码登录

通常在个人网站中&#xff0c;都会有各种第三方登录&#xff0c;其中微信登录需要认证才能使用&#xff0c;导致个人开发者不能进行使用此功能&#xff0c;但是我们可以使用微信公众号回复特定验证码来进行登录操作。 微信关键词处理 微信公众号关键词自动回复&#xff0c;具体…

第四套CCF信息学奥赛c++ CSP-J认证初级组 中小学信奥赛入门组初赛考前模拟冲刺题(完善程序题)

第四套中小学信息学奥赛CSP-J考前冲刺题 三、完善程序题 第一题 田忌赛马 田忌赛马&#xff0c;田忌每赢一次齐王的马就得200金&#xff0c;,当然输了就扣200金币&#xff0c;平局则金币数 不变。 #include<iostream> using namespace std; int main(){int n;while(c…

ARM系列 -- 虚拟化(二)

上一篇介绍了虚拟化和hypervisor的基本概念。为了配合虚拟化&#xff0c;ARM做了许多工作&#xff0c;首先是定义了四个异常等级&#xff08;Exception Level&#xff0c;简称EL&#xff09;。 前面介绍异常和特权的文章中有介绍&#xff0c;此处再啰嗦几句。每个异常级别都有…

css transform 会影响position 定位

比如通过以下代码.实现导航条上的每个li栏目,以不同的时间间隔,从上向下移动进来并显示 .my-navbar ul li {position: relative;opacity: 0;transform: translateY(-30px);transition: transform .6s cubic-bezier(.165,.84,.44,1),opacity .6s cubic-bezier(.165,.84,.44,1);…

Delphi 报错 Type androidx.collection.ArraySet is defined multiple times

Delphi 11 建立一个新的 Multi-Device Application 编译成app的时候报错 报错信息 [PAClient Error] Error: E7688 Unable to execute "E:\Program\Java\jdk1.8.0_301\bin\java.exe" -cp "e:\program\embarcadero\studio\22.0\bin\Android\r8-3.3.28.jar"…

【学习笔记】Vue3源码解析:第二部分-实现响应式(2)

课程地址&#xff1a;【已完结】全网最详细Vue3源码解析&#xff01;&#xff08;一行行带你手写Vue3源码&#xff09; 第二部分-实现响应式&#xff08;2&#xff09;&#xff1a;&#xff08;对应课程的第6-9节&#xff09; 第6节&#xff1a;《实现proxy代理以及解决重复代…

基于DPU和HADOS-RACE加速Spark 3.x

背景简介 Apache Spark&#xff08;下文简称Spark&#xff09;是一种开源集群计算引擎&#xff0c;支持批/流计算、SQL分析、机器学习、图计算等计算范式&#xff0c;以其强大的容错能力、可扩展性、函数式API、多语言支持&#xff08;SQL、Python、Java、Scala、R&#xff09…

SAP PO接口行项目json缺少中括号[]问题

PO接口小问题问题&#xff1a;如果需要同时传输DATA与ITEM&#xff0c;此处选择很重要&#xff0c;如果选择&#xff1a;HTTP Header ITEM将缺少[].需要注意 PO接口小问题 问题&#xff1a;如果需要同时传输DATA与ITEM&#xff0c;此处选择很重要&#xff0c;如果选择&#…

一次奇怪的事故:机器网络连接打满,导致服务不可用

业务背景 发生事故的业务系统是一个toB业务&#xff0c;业务是服务很多中小企业进行某项公共信息指标查询。系统特点:业务处理相对简单&#xff0c;但是流量大&#xff0c;且对请求响应要求较高&#xff1a; 业务请求峰值qps达50w&#xff0c;平时流量达20w左右。 请求响应时…

中国专家主导的ISO隐私计算国际标准立项,蚂蚁链摩斯参与编写

蚂蚁集团联合阿里巴巴、中科院信工所等单位联合推动的ISO/IEC 4922-3&#xff08;Information security -- Secure multiparty computation -- Part 3: Mechanisms based on garbled circuit &#xff09;正式通过ISO/IEC JTC 1 SC27的International standard (IS, 国际标准&am…

电机效率MAP图

直接使用contourf&#xff0c;需要有[X,Y] meshgrid(x,y), 并用Zf(X,Y)来生成Z轴。但是如果一开始Z轴坐标就不是x,y用函数生成的&#xff0c;而是有个默认的测试数据&#xff0c;又该如何用来画MAP图呢? clc;clear;clf; data_ECO []; //具体数值可以自己填&#xff0c;此处…

浅谈JAVA中锁的优化机制

引言&#xff1a; 从JDK1.6版本之后&#xff0c;synchronized本身也在不断优化锁的机制&#xff0c;有些情况下他并不会是一个很重量 级的锁了。优化机制包括自适应锁、自旋锁、锁消除、锁粗化、轻量级锁和偏向锁。 锁的状态从低到高依次为 无锁->偏向锁->轻量级锁->重…

uniapp的微信小程序授权头像昵称(最新版)

前面我出过两期博客关于小程序授权登录,利用php实现一个简单的小程序授权登录并存储授权用户信息到数据库的完整流程。无奈&#xff0c;小程序官方又整幺蛾子了。wx.getUserInfo接口收回&#xff0c;wx.getUserProfile接口也不让用。导致我的个人小程序&#xff1a;梦缘 的授权…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第12章 项目质量管理(一)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…