ArrayList清空后需调用trimToSize()才能缩减底层数组容量,先clear()再trimToSize()可双重释放内存;初始化时指定预期容量可避免冗余扩容;removeIf等批量删除后也应调用trimToSize()。

ArrayList 默认不会自动缩减内部数组容量,即使你清空了所有元素,底层数组仍保持原大小。要真正释放多余内存,需手动触发容量收缩。
调用 trimToSize() 方法
这是最直接、标准的方式。它会将底层数组大小精确调整为当前元素个数(size),丢弃多余空间。
- 适用于已明确不再添加新元素的场景,比如构建完成后只读使用
- 调用后,若后续再 add(),数组仍会按需扩容(1.5 倍),不破坏安全性
- 示例:list.trimToSize(); —— 立即生效,无返回值
先清空再收缩:避免残留引用
如果集合曾存过大量大对象(如 byte[]、大字符串),仅 clear() 不释放数组,旧对象引用可能被意外保留。建议组合操作:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先调用 list.clear() 清除所有元素并置 null 引用
- 再调用 list.trimToSize() 缩小数组本身
- 这样既清数据,又缩空间,双重释放
构造时预估容量,减少初始浪费
从源头控制更高效。如果知道大概元素数量,初始化就指定容量:
立即学习“Java免费学习笔记(深入)”;
- new ArrayList(expectedSize) —— 避免多次扩容和冗余数组复制
- 例如预计存 1000 个对象,直接 new ArrayList(1000),而非默认 10
- 配合 trimToSize(),可实现“精准分配 + 零冗余”内存使用
注意:removeIf 或 removeAll 后也要收缩
批量删除后 size 变小,但容量不变。若之后不再增容,记得补上 trimToSize():
- list.removeIf(x -> x.isExpired());
- list.trimToSize(); // 别忘了这步
- 否则老数组一直占着堆内存,GC 也无法回收那块数组空间

















