trimtosize() 将 arraylist 底层数组长度缩小至当前元素个数 size,减少对象自身堆内存占用;它不触发 gc、不释放内存给操作系统,仅在 size 显著小于数组长度且后续无大幅扩容时才有效。

Java ArrayList 的 trimToSize 方法不会“释放内存”给 JVM,而是把底层数组(elementData)的长度缩小到当前实际元素个数(size),从而减少该数组对象自身占用的堆内存。它不触发 GC,也不影响其他对象,只是让 ArrayList 更紧凑。
trimToSize 做了什么?
ArrayList 内部用一个 Object 数组存储元素,默认扩容策略是 1.5 倍增长,所以常有“已分配但未使用”的空间。调用 trimToSize() 后:
- 检查当前
size是否小于底层数组长度(elementData.length) - 如果确实有冗余,就新建一个长度为
size的数组 - 把原数组前
size个元素复制过去 - 用新数组替换
elementData
什么时候调用才有效?
只有在以下情况调用才有意义:
- ArrayList 经历过多次 add/remove,当前
size远小于初始容量或历史最大容量 - 你确定这个 ArrayList 后续不会再大幅扩容(否则很快又得扩容,反而浪费复制开销)
- 该 ArrayList 生命周期长、长期驻留内存,且对内存敏感(如服务端缓存大量列表)
例如:一次性加载 10 万条数据进 ArrayList,处理后只保留前 1000 条,此时调用 trimToSize() 可将底层数组从约 14 万长度缩到 1000,显著降低内存占用。
注意事项和常见误区
它不等于“释放内存给操作系统” —— JVM 堆内存由 GC 管理,数组变小只是减少了该对象的大小,GC 仍按需回收整个对象;
它不是线程安全的 —— 调用期间若其他线程正在读写该 ArrayList,可能引发数据错乱或异常;
有轻微性能成本 —— 涉及数组复制,元素越多开销越大;
不能替代合理初始化 —— 如果你知道最终大小,构造时传入初始容量(new ArrayList(expectedSize))更高效,避免反复扩容再 trim。
简单示例
(注意:仅演示效果,生产中需权衡)
ArrayList<string> list = new ArrayList(); for (int i = 0; i </string>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











