当前位置: 首页 > news >正文

《ArrayList的初始化和扩容源代码解读》

1. 构造方法的源代码解读

(1)无参构造

public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
  • 将elementData初始化为一个空数组;
  • DEFAULTCAPACITY_EMPTY_ELEMENTDATA 是一个空数组({}),用于标记“尚未真正初始化”;
  • 此时底层数组长度为 0,不会分配默认容量 10;
  • 真正的容量(10)会在第一次调用 add() 时通过扩容机制分配

(2)指定初始容量的构造方法

public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } }
  • 初始容量> 0:创建指定大小的数组
  • 初始容量 = 0:使用空数组EMPTY_ELEMENTDATA
  • 初始容量< 0:抛出IllegalArgumentException异常

(3)使用集合构造

public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); if ((size = elementData.length) != 0) { if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } else { // replace with empty array. this.elementData = EMPTY_ELEMENTDATA; } }
  • 将集合转为Object数组,赋值给elementData
  • 处理c.toArray()可能返回非Object[]类型的情况
  • 如果集合为空,初始化为空数组

2. add()方法的源代码解读

public boolean add(E e) { ensureCapacityInternal(size + 1); //确保容量足够 elementData[size++] = e; //添加元素 return true; }

计算最小所需容量

private static int calculateCapacity(Object[] elementData, int minCapacity) { //如果是无参构造的默认空数组,直接返回默认容量10 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; }
  • 若是首次添加(底层数组为 DEFAULTCAPACITY_EMPTY_ELEMENTDATA,也就是为空),则 minCapacity 至少为 DEFAULT_CAPACITY(即 10);

确保底层数组有足够的内部容量

private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); }

接着调用 ensureExplicitCapacity(),判断是否需要扩容

private void ensureExplicitCapacity(int minCapacity) { modCount++; // 最小所需容量 > 底层数组当前长度 → 容量不足,触发扩容 if (minCapacity - elementData.length > 0) grow(minCapacity); }

3. grow()方法的源代码解读

private void grow(int minCapacity) { // 获取当前底层数组的旧容量 int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1);//扩容1.5倍 if (newCapacity - minCapacity < 0) newCapacity = minCapacity;
  • 当1.5倍扩容后仍小于所需最小容量时

  • 直接使用所需最小容量

if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity);//处理大容量 elementData = Arrays.copyOf(elementData, newCapacity); }

MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
超过则调用 hugeCapacity();

http://www.jsqmd.com/news/1399028/

相关文章:

  • ExPose:革命性单目3D人体姿态估计技术,一键实现精准的身体形状与表情捕捉
  • 告别 30 天倒计时:KMS_VL_ALL_AIO 让 Windows 与 Office 激活一步到位
  • 免费开源的Windows时间统计工具Tai:三步装好,一周后你就再也不会问“时间去哪了“
  • 找不到PS3游戏更新补丁?这份开源下载器上手手册帮你一次搞定
  • 2026年韩国进口食品批发商推荐:行业**引领新趋势 - 官方资讯
  • scrcpy 连接总翻车?新手绕开这 6 类坑,安卓投屏一次就成
  • 揭秘邯郸市领创中等专业学校招生热线,家长学生必看! - 官方资讯
  • 2026马年新春创意线上投票活动方案推荐[最新合集]
  • 掌握OCaml异步编程:Jane Street Workshop中的Async库应用教程
  • 湖北 6‑18 岁全封闭文武学校|** 名单曝光,黄龙文武学校课程、报名须知完整解读 - 全国文武学校招生
  • Tiled地图编辑器核心技术拆解:从位运算图元到插件生态的工程实践
  • Swift分布式系统进阶:集群单例模式(Cluster Singleton)最佳实践
  • gh_mirrors/tr/trading监控与可观测性:Grafana实时追踪JVM性能与业务指标
  • 长三角贵金属回收市场规范化|常州黄金回收行业准则解读,参照苏沪杭监管要求,帮你避开交易风险点 - 日常前沿快讯
  • 佛山处置闲置奢品包小常识 合扬老品牌透明回收大牌包包 - 一刻涨新知
  • 2026广东服务好的智能装备外观设计工作室 机械设备外观设计优质推荐 - 变量人生001
  • 直播抢码总是慢半拍?试试 MHY_Scanner 这个毫秒级扫码登录工具
  • 2026年韩国进口食品批发商推荐**,选对商家很重要! - 官方资讯
  • 探索未来教育之路:邯郸市领创中专招生信息全解析 - 官方资讯
  • Tiled地图编辑器深度解析:分层数据模型与智能地形引擎的实现之道
  • 武汉钻石回收:别只看 4C 证书!这些隐性折价点才是砍价关键 - 奢侈品回收研习社
  • soildworks2025下载分享(只供学习交流)
  • 告别复制粘贴:用 feishu2md 三步搞定飞书文档转 Markdown
  • 收到东方不败 - 资讯快报员
  • 小学生学C++编程语法知识(C++中new和delete的实现原理)
  • 停车王车牌键盘-Android:高效车牌输入的终极解决方案
  • RyuSAK 入门指南:如何用 3 步完成 Ryujinx 模拟器资源管理
  • 决定一台黑群晖上限的,往往是被随手买来的那个启动盘
  • DLSS Swapper 完整上手指南:10 分钟完成游戏 DLSS 版本升级与替换
  • 2026年韩国进口食品批发商推荐**,谁是真正的性价比之王? - 官方资讯