ArrayList扩容机制的学习笔记

简介: 本文深入剖析ArrayList的add()方法及扩容机制:首次添加元素时默认扩容至10;后续按1.5倍(oldCapacity + oldCapacity>>1)增长;通过ensureCapacityInternal、ensureExplicitCapacity和grow等方法协同实现动态扩容,兼顾效率与内存优化。(239字)
  • 我们先来看Add方法
/**
*将指定的元素追加到此列表的末尾
*/
public boolean add(E e) {
  //添加元素之前,先调用ensureCapacityInternal方法
  ensureCapacityInternal(size + 1);  // Increments modCount!!(增量modCount)
  //这里看到ArrayList添加元素的实质就相当于为数组赋值
  elementData[size++] = e;
  return true;
}
  • 再来看看ensureCapacityInternal()方法,可以看到add()方法首先调用了ensureCapacityInternal(size+1)
//得到最小扩容量
private void ensureCapacityInternal(int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        //获取默认的容量和传入参数的较大值(第一次的较大值是DEFAULT_CAPACITY=10,minCapacity=1)
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    ensureExplicitCapacity(minCapacity);
}

当要add进第一个元素时,minCapacity为1,在Math.max()方法比较后,minCapacity为10

  • ensureExplicitCapacity()方法
//判断是否需要扩容
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方法进行扩容
  4. grow方法
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() 方法是针对泛型集合说的,如果想看这个泛型有多少元素,就调用此方法类查看!


相关文章
|
2月前
|
人工智能 API 机器人
OpenClaw 用户部署和使用指南汇总
本文档为OpenClaw(原MoltBot)官方使用指南,涵盖一键部署(阿里云轻量服务器年仅68元)、钉钉/飞书/企微等多平台AI员工搭建、典型场景实践及高频问题FAQ。同步更新产品化修复进展,助力用户高效落地7×24小时主动执行AI助手。
26001 178
|
11小时前
|
人工智能 弹性计算 安全
OpenClaw是什么?OpenClaw能做什么?OpenClaw详细介绍及保姆级部署教程
2026年爆火的开源AI智能体OpenClaw(昵称“小龙虾”),是首个本地化、跨平台的“数字员工”,能自主执行邮件处理、代码编写、智能家居控制等任务。60天GitHub星标破34万,获黄仁勋、Karpathy盛赞。本文提供阿里云一键部署教程,零代码快速上手!
50 10
|
12小时前
|
机器学习/深度学习 人工智能 算法
道路表面缺陷数据集分享(YOLO系列分类检测)| 路面病害 目标检测 坑洼裂缝 训练集
本数据集含6000张高清道路缺陷图像,涵盖裂缝、坑洼、井盖等8类缺陷,已按YOLO格式精准标注并划分(7:2:1)。适用于YOLO系列等目标检测模型训练,支持智能巡检、自动驾驶与智慧交通研究。百度网盘免费下载。
33 8
|
12小时前
|
运维 Prometheus 监控
阿里云/本地部署OpenClaw图文流程+ 企业级全维度监控运维、告警体系搭建教程
OpenClaw 的监控体系是保障 AI 智能体稳定运行的核心,需从基础原生监控逐步过渡到企业级工具监控,覆盖资源、进程、任务、日志、网络五大维度。个人用户可通过原生工具与日志分析快速落地基础监控,企业用户则需结合 Prometheus + Grafana、ELK、Zabbix 等工具搭建全链路监控与告警体系。配合 2026 年阿里云及本地多系统部署流程、阿里云百炼免费大模型配置,可实现 OpenClaw 从部署到运维的全流程稳定可控。
34 3
|
12小时前
|
供应链 安全 iOS开发
OpenAI 发布重要安全公告:macOS 用户请注意!
OpenAI确认第三方库Axios遭行业性供应链攻击,但用户数据、系统及软件均未被入侵。为防范假冒应用,macOS用户需立即更新官方App至最新版,网页版、iOS、Windows不受影响。(239字)
|
14小时前
|
存储 人工智能 监控
AI龙虾OpenClaw 阿里云1分钟部署及必看的5大高阶实用玩法分享
OpenClaw(俗称龙虾)的核心价值远不止基础对话与简单任务执行,其真正的生产力体现在“长期记忆沉淀、跨平台联动、多智能体协作、无人值守自动化”四大高阶能力上。本文基于2026年最新版本特性,深度拆解5个改变工作方式的实用玩法——长期记忆日志系统、热门内容实时提醒、手机远程氛围编程、多AI私人研发团队、通宵无人值守任务,同时提供阿里云+本地多系统部署流程、阿里云百炼免费大模型配置,所有命令可直接复制执行,助力用户充分释放OpenClaw的效率潜力。
44 1
|
17小时前
|
人工智能 自然语言处理 安全
2026 最新版 OpenClaw 小白专属安装教程,纯鼠标操作零难度(包含新安装包)
专为零基础新手制作的 OpenClaw 中文版安装教程,2026 新版安装包全程图形化界面,只需点击下一步即可完成安装,自动汉化、自动配置、自动适配,不用懂技术也能顺利安装并正常使用。
|
13小时前
|
数据采集 自动驾驶 算法
道路设施目标检测数据集(约5000张已标注)|YOLO训练与智能交通应用数据集
本数据集含约5000张真实道路图像,精准标注交通标志、热塑标线、金属护栏、减速带4类设施,采用YOLO标准格式(归一化bbox),已划分train/val/test集。覆盖多场景、多光照、多尺度,支持YOLOv5/v8等直接训练,适用于智能巡检、自动驾驶感知与交通管理。
道路设施目标检测数据集(约5000张已标注)|YOLO训练与智能交通应用数据集
|
13小时前
|
存储 弹性计算 运维
阿里云服务器ECS全方位介绍:架构、性能、适用场景、收费标准与活动价格
阿里云服务器ECS是卓越、稳定可靠的IaaS服务,免去前期IT硬件采购准备,实现计算资源即开即用与弹性伸缩,满足多种业务需求。ECS支持主流处理器架构,提供上百种实例规格,满足不同用户需求。其优势包括多样化计算能力、便捷易用、成本优化、弹性灵活、稳定可靠及安全保障。无论是轻量应用服务器还是第九代高性能实例,ECS均展现核心价值。阿里云还提供多种优惠活动和计费方式,助力企业和开发者低成本上云。
阿里云服务器ECS全方位介绍:架构、性能、适用场景、收费标准与活动价格
|
14小时前
|
编译器 C++
Markdown 里写公式,别只知道 LaTeX!试试 HTML 标签,简单到飞起
1. **零学习成本**:只要你懂一点点 HTML,立刻上手。 2. **跨平台兼容**:几乎所有支持 Markdown 的编辑器(Typora、VS Code、Obsidian、Notion)都完美支持内嵌 HTML 标签。 3. **代码可读性高**:相比 LaTeX 的花括号,标签语义更清晰。 4. **适合轻量场景**:当你不需要复杂的矩阵、积分时,用标签快得多。
28 2
Markdown 里写公式,别只知道 LaTeX!试试 HTML 标签,简单到飞起

热门文章

最新文章