《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()

相关新闻

为什么需要react-merge-refs?解决React组件开发中的refs冲突难题

为什么需要react-merge-refs?解决React组件开发中的refs冲突难题

为什么需要react-merge-refs?解决React组件开发中的refs冲突难题 【免费下载链接】react-merge-refs React utility to merge refs 🖇 项目地址: https://gitcode.com/gh_mirrors/re/react-merge-refs 在React组件开发中,refs是连接DO…

2026/11/3 5:04:00 阅读更多 →
MML文件完全攻略:CartoCSS项目的核心配置与数据源管理

MML文件完全攻略:CartoCSS项目的核心配置与数据源管理

MML文件完全攻略:CartoCSS项目的核心配置与数据源管理 【免费下载链接】carto fast CSS-like map stylesheets 项目地址: https://gitcode.com/gh_mirrors/ca/carto MML(Map Markup Language)文件是CartoCSS项目的核心配置文件&#x…

2026/10/25 14:42:45 阅读更多 →
让AI告别模板脸:Taste-Skill前端设计规范实战指南

让AI告别模板脸:Taste-Skill前端设计规范实战指南

让AI告别模板脸:Taste-Skill前端设计规范实战指南 【免费下载链接】taste-skill Taste-Skill - gives your AI good taste. stops the AI from generating boring, generic slop 项目地址: https://gitcode.com/GitHub_Trending/ta/taste-skill 让 AI 写一个…

2026/10/30 17:16:19 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/3 1:09:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/2 10:46:11 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/2 10:47:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/3 2:27:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/2 10:46:31 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/2 10:46:26 阅读更多 →

日新闻

周新闻

月新闻