ArrayList不会自动缩容,需调用trimToSize()将底层数组容量精确调整为当前元素个数以释放内存,适用于批量删除后或确定不再扩容的场景。

ArrayList 不会自动缩容,即使调用 remove() 清空了大部分元素,内部数组(elementData)仍保持原容量,导致内存浪费。手动缩容的核心是让底层数组大小匹配实际元素数量,常用方法是调用 trimToSize()。
使用 trimToSize() 强制缩容到实际大小
这是最直接、标准的做法。该方法将底层数组容量精确调整为当前元素个数(size),释放多余空间。
- 调用时机:在批量删除、初始化填充后不再增删、或明确知道后续不会扩容时使用
- 示例:// 假设 list 原有 10000 个元素,删掉 9000 个后
list.removeIf(x -> x <br><code>list.trimToSize(); // 容量从 10000+ 缩至约 1000 - 注意:该操作会触发一次数组复制(创建新数组 + 拷贝元素),有轻微开销,但通常远小于长期持有大数组的内存成本
新建 ArrayList 并批量转移(适合需进一步控制容量的场景)
当不满足于“缩到 size”,而希望容量略大于 size(比如预留少量增长空间),或原 list 已极度膨胀(如 size=100,capacity=100000),可主动重建:
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
- 用带初始容量的构造器创建新 list:
new ArrayList(list.size()) - 再用
addAll()或循环添加所有元素 - 优点:可自定义容量(例如
new ArrayList(list.size() + 16)),避免立即扩容;也适用于不可修改原引用的上下文
避免误用 ensureCapacity() 和 reserve()(不存在的方法)
有人会尝试调用 ensureCapacity() 来“缩小”,但该方法只做一件事:确保容量 ≥ 指定值,**永远不会减小容量**。Java 中也没有 reserve() 方法(那是 C++ vector 的)。依赖这些方法无法实现缩容。
立即学习“Java免费学习笔记(深入)”;
结合 clear() 后 trimToSize() 彻底释放
如果目标是清空并释放全部内存,仅调用 clear() 不够——它只置空元素引用、重置 size,但数组还在。
- 正确做法:
list.clear(); list.trimToSize(); - 效果:底层数组变为长度为 0 的空数组(JDK 12+)或最小默认容量(如 JDK 8 是空数组,JDK 11+ 优化为
EMPTY_ELEMENTDATA),内存占用降到最低

















