trimtosize用于将arraylist容量缩减至当前元素个数以释放内存,适用于构建后只读、长期持有小数据量大容量列表及内存敏感场景,调用后capacity等于size,但不可在频繁增删中使用。

trimToSize 是 ArrayList 提供的一个简单但容易被忽略的方法,它能将内部数组的容量(capacity)缩小到当前元素个数(size),从而释放未使用的内存空间。
什么时候该调用 trimToSize
ArrayList 底层用数组实现,默认扩容策略是“1.5 倍增长”,比如从 10 扩到 15、再扩到 22……多次 add 后,实际元素可能只有几十个,但数组容量可能几百甚至上千。如果这个 ArrayList 后续不再添加元素(比如构建完就只读),调用 trimToSize 可以减少内存占用。
- 集合初始化后批量添加完成,且确定不会再增删
- 长期存活的对象中持有大容量 ArrayList,但实际数据量小
- 对内存敏感的场景(如 Android、服务端高并发缓存、离线批处理)
怎么正确调用 trimToSize
直接在 ArrayList 实例上调用即可,无需参数:
ArrayList<string> list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
// 此时 size=3,但 capacity 可能是 10 或更多
list.trimToSize(); // 现在 capacity == size == 3</string>
注意:该方法是 无返回值 的 void 方法,不会新建对象,只修改内部 elementData 数组引用(可能触发一次数组拷贝)。
调用时机和注意事项
- 不要在循环中频繁 add 的同时反复 trimToSize,会抵消扩容优化,降低性能
- 如果后续还会 add,trimToSize 后再 add 又会触发扩容,反而多一次数组复制
- 对于空集合(size == 0),trimToSize 会把容量设为 0,elementData 变成 EMPTY_ELEMENTDATA(共享空数组)
- 无法缩减已存在但未被清除的 null 引用 —— 如果你手动置 null 了某些位置,trimToSize 不管这些,只看 size
替代方案与补充说明
如果想从一开始控制容量,可用带初始容量的构造方法:
ArrayList<string> list = new ArrayList(50); // 初始容量 50,避免早期扩容</string>
或者结合 ensureCapacity 预留空间;而 trimToSize 是“事后精简”,两者配合使用更合理。JDK 21+ 中仍保留该方法,行为未变,兼容性好。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











