ArrayList扩容机制

简介: ArrayList扩容机制简介:添加元素时,先通过ensureCapacityInternal()判断容量,首次扩容默认为10;当容量不足时,调用grow()方法,新容量为原容量的1.5倍(oldCapacity + (oldCapacity >> 1)),并通过Arrays.copyOf()实现数组扩容。

ArrayList扩容机制

先来看Add方法

再来看看ensureCapacityInternal()方法,可以看到add()方法首先调用了ensureCapacityInternal(size+1)
当要add进第一个元素时,minCapacity为1,在Math.max()方法比较后,minCapacity为10
ensureExplicitCapacity()方法

Java

运行代码复制代码

1

2

3

4

5

6

7

8

//判断是否需要扩容

private void ensureExplicitCapacity(int minCapacity) {

modCount++;

// overflow-conscious code

if (minCapacity - elementData.length > 0)

//调用grow()方法进行扩容,调用此方法代表已经开始扩容了

grow(minCapacity);

}

我们来仔细分析一下
1当我们要add进第一个元素到ArrayList时,elementData.length为0(因为还是一个空的list,里面还没有数据,所以没有进行扩容,默认扩容10),因为执行了ensureCapacityInternal()方法,所以minCapacity此时为10。此时,minCapacity - elemetData.length > 0(minCapacity=10,elemetData.length=0)成立,所以会进入==grow(minCapacity)==方法。
2当add第2个元素时,minCapacity为2,此时elementData.length(容量)在添加第一个元素后扩容成10了。此时,minCapacity - elementData.length > 0不成立,所以不会进入(执行)==grow(minCapacity)==方法。
3添加第3、4…到第10个元素时,依然不会执行==grow()==方法,数组容量都为10。知道添加第11个元素,minCapacity(为11)比elementData.length(为10)要大。进行grow方法进行扩容
4grow方法

Java

运行代码复制代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

private void grow(int minCapacity) {

// oldCapacity为旧容量,newCapacity为新容量

int oldCapacity = elementData.length;//(0,10,15)

//将oldCapacity右移一位,其效果相当于oldCapacity/2;

// 我们知道位运算的速度远远快于整除运算,整句运算式的结果就是将新容量更新为旧容量的1.5倍

int newCapacity = oldCapacity + (oldCapacity >> 1);

// 然后检查新容量是否大于最小需要容量,若还是小于最小需要容量,那么久把最小需要容量当作数组的新容量

if (newCapacity - minCapacity < 0)

newCapacity = minCapacity;

//判断新容量是否大于集合的最大容量(一般大不了)

if (newCapacity - MAX_ARRAY_SIZE > 0)

newCapacity = hugeCapacity(minCapacity);

// 给elementData从新赋值(10,15)

elementData = Arrays.copyOf(elementData, newCapacity);

}

int newCapacity = oldCapacity + (oldCapacity >> 1),所以 ArrayList 每次扩容之后容量都会变为原来的 1.5 倍!
“>>”(移位运算符):>>1 右移一位相当于除2,右移n位相当于除以 2 的 n 次方。这里 oldCapacity 明显右移了1位所以相当于oldCapacity /2。对于大数据的2进制运算,位移运算符比那些普通运算符的运算要快很多,因为程序仅仅移动一下而已,不去计算,这样提高了效率,节省了资源
通过例子探究一下grow()方法
当add第一个元素时,oldCapacity为0,经比较后第一个if判断成立,newCapacity = minCapacity(为10)。但是第二个if判断不会成立,即newCapacity不比MAX_ARRAY_SIZE大,则不会进入hugeCapacity方法。数组容量为10,add方法中return true,size增为1。
当add第11个元素进入grow方法时,newCapacity为15,比minCapacity(为11)大,第一个if判断不成立。新容量没有大于数组最大size,不会进入hugeCapacity方法。数组容量扩为15,add方法中rerurn,true,size增为11。
以此类推…这里补充一点比较重要,但是容易被忽视掉的知识点:
java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性。
java中的length() 方法是针对字符串说的,如果想看这个字符串的长度则用到 length() 这个方法。
java中的size() 方法是针对泛型集合说的,如果想看这个泛型有多少元素,就调用此方法类查看!



相关文章
|
SQL 数据库
若依框架---树状层级部门数据库表
若依框架---树状层级部门数据库表
1742 0
|
2月前
|
Arthas 人工智能 Java
我们做了比你更懂 Java 的 AI-Agent -- Arthas Agent
Arthas Agent 是基于阿里开源Java诊断工具Arthas的AI智能助手,支持自然语言提问,自动匹配排障技能、生成安全可控命令、循证推进并输出结构化报告,大幅降低线上问题定位门槛。
1704 64
我们做了比你更懂 Java 的 AI-Agent -- Arthas Agent
|
5月前
|
数据采集 领域建模 数据库
领域模型图(数据架构/ER图)
本文介绍通过四色原型法构建领域模型并生成ER图的过程。运用MI(时标)、PPT(参与方-地点-物品)、Role(角色)和DESC(描述)四种原型,逐步抽象风控系统的业务流程,提炼实体与关系,最终形成数据架构中的ER图,为数据库设计提供基础支撑。(238字)
|
10月前
|
安全 Java API
Java 8 Stream API:高效集合处理的利器
Java 8 Stream API:高效集合处理的利器
393 83
|
5月前
|
人工智能 自然语言处理 API
全面认识MCP:大模型连接真实世界的“USB-C接口”
MCP(模型上下文协议)是Anthropic推出的开放标准,被誉为AI时代的“USB-C接口”,旨在统一大模型与外部工具、数据源的连接方式。它通过标准化通信,让AI智能体能高效调用天气、数据库等各类工具,打破“工具孤岛”,简化开发流程,推动AI应用从对话走向真实世界任务执行,加速构建安全、可扩展的智能生态。
|
5月前
|
人工智能 JSON 数据挖掘
大模型应用开发中MCP与Function Call的关系与区别
MCP与Function Call是大模型应用开发中的关键技术。前者为跨模型工具调用提供标准化协议,实现解耦与兼容;后者是模型调用外部功能的内置机制。二者互补,共同构建“意图解析-协议传输-工具执行”的分层架构,推动AI应用生态发展。
|
5月前
|
监控 NoSQL JavaScript
1-JeecgBoot介绍
JeecgBoot是一款基于代码生成器的低代码开发平台,采用SpringBoot2.x、Vue、Ant Design等主流技术,实现前后端分离。支持分布式、微服务架构,集成Shiro、JWT、Redis、Nacos等组件,提供高效开发能力。
|
5月前
|
Java 开发工具 数据安全/隐私保护
项目《中州养老》
项目《中州养老》是一个面向养老院的后台管理系统,涵盖员工管理端与家属小程序端,实现预约、入住、健康监测等全流程管理。系统采用SpringBoot+Vue3技术栈,集成Redis缓存、阿里云IoT平台与OSS存储,支持智能设备数据采集与实时报警,提升养老管理智能化水平。
 项目《中州养老》
|
5月前
|
消息中间件 人工智能 NoSQL
RocketMQ:A2A协议实现多智能体优化
Apache RocketMQ推出LiteTopic轻量级通信模型,结合A2A协议与AgentScope框架,为多智能体系统提供高可靠、低延迟的异步通信方案,支持会话持久化、断点续传与动态协同,助力AI应用构建稳定高效的协作基座。
 RocketMQ:A2A协议实现多智能体优化
|
5月前
|
Java Nacos 数据安全/隐私保护
微服务版本
本文介绍基于Spring Cloud的微服务项目搭建与配置,涵盖代码拉取、Nacos注册中心部署、数据库导入及前后端服务启动流程。重点讲解常见问题排查,如密码错误修复、依赖配置调整,并指导完成前端环境初始化与页面验证,确保系统正常运行。