四、ArrayList底层源码详解

news2025/1/12 16:16:20

文章目录

  • 特点
  • 底层源码分析
    • 创建
      • 无参构造器
      • 有参构造器
      • 传入集合的有参构造器
    • 扩容
    • 注意new ArrayList(0)

菜鸟教程ArrayList讲解

特点

  • 可以加入控制null(可加入多个)
  • 底层是数组实现的
  • ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高)看源码(没有synchronized),在多线程情况下,不建议使用ArrayList
  • ArrayList中维护了一个0bject类型的数组elementData
  • 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍。
  • 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。

底层源码分析

创建

无参构造器

ArrayList list = new ArrayList();底层的实现方式
在这里插入图片描述

有参构造器

ArrayList list = new ArrayList(8);底层实现
在这里插入图片描述

传入集合的有参构造器

在这里插入图片描述

  • elementData = c.toArray():将c对象转换成数组赋值给elementData
  • 然后判断内容是否为空,为空的话就直接赋值一个空数组
  • 不为空的话需要判断elementData是不是一个Object[].class,(因为c.toArray()是转换成数组赋值给elementData,而elementData里面添加的元素都是以Object[].class添加进去的),所以如果不是Object[].class类就转换成Object[].class类。

也就说明,无参构造器,一开始得到的集合是空的

扩容

list.add(new Book(“红楼梦”,30,“曹雪芹”));底层的实现

  1. 首先走到这里在这里插入图片描述

    • E e:表示添加数据时传进来的数据
    • ensureCapacityInternal(size + 1):判断是否需要扩容(无参构造器一开始未初始化size,java中默认为0)
    • elementData[size++] = e:add是在最后添加数据
  2. 然后再进入ensureCapacityInternal(size + 1)判断是否需要扩容在这里插入图片描述

  3. 进入calculateCapacity(Object[] elementData, int minCapacity)确定扩容的容量在这里插入图片描述

    • DEFAULTCAPACITY_EMPTY_ELEMENTDATA:空数组
    • DEFAULT_CAPACITY常量10
    • minCapacity:数组添加完这个数据时的容量
  4. 再进入这个方法,确定添加数据

    • modCount:记录添加次数(防止多线程同时修改)
    • if (minCapacity - elementData.length > 0):判断当前内容和数组容量大小,如果数组容量够就没必要扩容
  5. 最后才进行扩容在这里插入图片描述

注意new ArrayList(0)

若有参构造时,传的数据是0,那么,扩容还是会按照0扩容,不会按照无参时考虑是否大于10,来扩容。即扩容后elementData数组容量依次为0、newCapacity=1、newCapacity=2、newCapacity=(2+2/2)=3、newCapacity=(3+3/2)=4,newCapacity=(4+4/2)=6,即第六次添加数据不扩容,第七次添加还用扩容…

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

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

相关文章

“消费盲返”就像一盒巧克力,你永远不知道下一颗是什么味道

如今电商平台竞争越来越激烈,传统电商直播短视频带货拼团带货内卷严重,我就经常刷抖音某多多看见各种优惠,感觉以前在实体店上面买东西都是冤大头,但是随之而来的是商家引流成本越来越高。 这些年来,互联网迅猛发展&am…

Allegro如何批量添加丝印文字操作指导

Allegro如何批量添加丝印文字操作指导 当需要在PCB上需要大量添加丝印文字的时候,是个较大的工作量,Allegro支持批量添加丝印文字到PCB上,如下图 具体操作如下 新建一个文本文档在文本文档中添加好需要的文字

红黑树详解

1.概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近…

漏洞丨cve2010-3333

作者:黑蛋 一、漏洞简介 cve-2010-3333是一个Office 2003 的栈溢出漏洞,其原因是在文档中读取一个属性值的时候,没有对其长度验证,导致了一个溢出,看着很简单的一个漏洞,却又有点恶心人。 二、漏洞环境 …

Python学习基础笔记五十五——接口类和抽象类

# 设计模式: 《设计模式》 接口类:Python原生不支持; 抽象类:Python原生支持的。 例: from abc import abstractmethod, ABCMetaclass Payment(metaclassABCMeta): # 元类 默认的元类是 type 规范类abstract…

MyBatis学习 | 全局配置文件

文章目录一、简介二、各个标签2.1 properties(属性)2.2 settings(设置)2.3 typeAliases(类型命名)2.4 typeHandlers(类型处理器)2.5 plugins(插件)2.6 enviro…

电容这段走线影响这么大?

公众号:高速先生 作者:李远恒 一日,来了一个电源仿真项目,雷工像往常一样熟练的打开了PCB文件,先是例行查板。不查不要紧,一查还真有问题,话不多说直接上图: 定睛一看,这…

星火计划学习笔记——参考线平滑算法解析及实现(以U型弯道场景仿真调试为例)

文章目录1. Apollo参考线介绍1.1 参考线的作用1.2 导航规划的路线1.3 为什么需要重新生成参考线1.4 ReferenceLine数据结构1.5 ReferencePoint数据结构1.6 参考线处理流程1.7 参考线生成2. 参考线平滑算法2.1 参考线平滑算法总览2.2 参考线平滑算法流程2.2.1 设置中间点anchor …

康希通信冲刺科创板上市:上半年收入2亿元,计划募资约8亿元

12月21日,格兰康希通信科技(上海)股份有限公司(下称“康希通信”)在上海证券交易所递交招股书,准备在科创板上市。本次冲刺科创板上市,康希通信计划募资7.82亿元。 据贝多财经了解,康…

Word处理控件Aspose.Words功能演示:在 Java 中将 DOC 或 DOCX 转换为 PNG

aspose.words是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外, Aspose API支持流行文件格式处…

【C++入门基础(上)】

Cross the stars over the moon to meet your better-self. 目录 1 命名空间 1.1 命名空间定义 1.2 命名空间使用 1.2.1 加命名空间名称及作用域限定符 1.2.2 使用using将命名空间中成员引入 1.2.3 使用using namespace 命名空间名称引入 2 C输入&&输出 3 缺省参数…

Mentor-dft 学习笔记 day47-On-Chip Clock Controller Design Description

On-Chip Clock Controller Design Description有三种类型的片上控制器设计:standard, parent, and child。可以根据设计要求选择它们。使用OCC时,必须考虑本节中讨论的设计元素。The Standard OCC 标准OCC为快速捕获提供快速时钟,为换档和慢速…

Java字节流的使用:字节输入/输出流、文件输入/输出流、字节数组输入/输出流

InputStream 是 Java 所有字节输入流类的父类,OutputStream 是 Java 所有字节输出流类的父类,它们都是一个抽象类,因此继承它们的子类要重新定义父类中的抽象方法。 这里首先介绍上述两个父类提供的常用方法,然后介绍如何使用它们…

springboot整合shiro + jwt + redis实现权限认证(上手即用)

目录前言项目结构依赖导入建数据库表建表语句使用插件生成增删改查添加MyRealm添加ShiroConfig添加JwtFilterJWT相关得类JwtTokenJwtAudienceJwtHelper添加BeanFactory只贴出主要得类,具体得可以看我的gitee,接口都自测过的。前言 最近项目中涉及到使用…

NEST.JS使用心得

最近部门分享了nest.js技术,旨在前端人员通过项目积累将可重复使用的数据或者自己需要的数据通过nest设计出接口方便快速开发,不需要等待后端开发人员的数据。学习了两天发现nest很有意思,所以来分享下最近两天的学习心得。 nest中文文档&am…

linux下使用命令TC进行网络限流 —— 筑梦之路

Linux 下的流量控制原理 通过对包的排队,我们可以控制数据包的发送方式。这种控制,称之为数据整形,shape the data,包括对数据的以下操作: 增加延时 丢包 重新排列 重复、损坏 速率控制 在 qdisc-class-filter 结构下&#x…

ADI Blackfin DSP处理器-BF533的开发详解64:电子相册的设计(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 代码实现功能 代码实现了将 SD 卡根目录下的所有文件进行文件列表,然后将 480*272 尺寸的 JPEG 文件进行 JPEG 解码,将解…

校园跳蚤市场平台/校园二手交易系统

摘 要 本文论述了校园跳蚤市场平台的设计和实现,该网站从实际运用的角度出发,运用了计算机网站设计、数据库等相关知识,网络和Mysql数据库设计来实现的,网站主要包括学生注册、学生登录、浏览商品、搜索商品、查看商品并进行购买…

Blender——“苹果”建模

效果图 1.调出点线面面板,衰减编辑 1.1打开blender,点击常规,按A全选物体(摄像头、光源、正方体),按delete删除。 1.2 在3D视图中添加一个经纬球。点击添加,选择网格—>经纬球。 1.3 点击下…

前端JS也可以连点成线(Vue中运用 AntVG6)

前言 什么是 G6?G6 是一个图可视化引擎。它提供了图的绘制、布局、分析、交互、动画等图可视化的基础能力。旨在让关系变得透明,简单。让用户获得关系数据的 Insight。其实说白了就是我们前端中的绘图工具;基于 G6,用户可以快速搭…