调用 trimtosize() 可将 arraylist 内部数组容量精确缩减为当前元素个数,释放冗余内存;创建时指定合理初始容量可避免多次 1.5 倍扩容;remove/clear 不缩容,需手动 trimtosize 或重建实例。

Java 中的 ArrayList 默认会在内部数组容量超出实际元素数量时保留冗余空间,以提升后续添加操作的性能。但如果你确定后续不会再频繁增删元素,且希望释放多余内存、减少堆占用,可以主动缩减其内部数组容量。
调用 trimToSize() 方法
这是最直接、标准的方式。它会将内部数组(elementData)的大小精确调整为当前元素个数(size),移除所有未使用的空间。
- 该方法是
public的,可随时调用 - 时间复杂度为 O(n),因为可能触发一次数组复制
- 适合在初始化后批量添加完成、进入只读或低频修改阶段时使用
示例:
ArrayList<string> list = new ArrayList();
list.add("a"); list.add("b"); list.add("c");
System.out.println(list.size()); // 3
System.out.println(getCapacity(list)); // 可能是 10(默认初始容量)
list.trimToSize();
System.out.println(getCapacity(list)); // 变为 3</string>
手动指定初始容量避免过度扩容
如果已知集合大致规模,创建时就传入合理容量,能从源头减少冗余。ArrayList 扩容策略是「1.5 倍增长」,多次扩容后容易积累大量空闲空间。
- 构造函数
new ArrayList(initialCapacity)可设初始容量 - 若预估有 1000 个元素,直接写
new ArrayList(1000),比默认 10 起步再扩 3–4 次更省内存 - 即使略高估也比反复扩容划算;若严重高估,之后仍可补调
trimToSize()
注意:remove() 不会自动缩容
删除元素(如 remove()、clear())只改变 size,内部数组长度(elementData.length)保持不变。也就是说,删光了 1000 个元素,数组仍占着原来 1000+ 的空间。
-
clear()后若不再添加,应立即调用trimToSize() - 若需彻底清空并释放内存,也可新建一个空列表:
list = new ArrayList();(原对象待 GC)
进阶:获取当前实际容量(非公开 API)
ArrayList 没有提供公开的 capacity() 方法,但可通过反射或借助 Arrays.asList(...).toArray().length 间接估算——不过不推荐生产环境使用反射查 elementData.length。
- 日常调试可用:通过 IDE 查看
elementData.length字段值 - 真正需要监控容量时,建议封装工具方法或改用
ArrayDeque(无自动扩容)、或第三方库如 Eclipse Collections 的MutableList
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











