clear()仅清空元素不释放内存;要重置容量需clear()后调用trimToSize()或新建ArrayList实例,避免使用removeAll()等低效方式。

Java 中 ArrayList 清空元素并重置容量,需分两步理解:清空内容用 clear(),但**不会释放底层数组内存(即不重置容量)**;若要真正缩小底层数组、释放内存,需手动创建新实例或通过技巧“诱导”扩容机制重置。
只清空元素(保留原容量)
调用 clear() 方法即可移除所有元素,但内部数组(elementData)仍保持原有大小,后续添加元素时无需立即扩容:
-
list.clear();—— 元素数量变为 0,size()返回 0 - 底层数组长度(
elementData.length)不变,内存未释放 - 适合频繁清空再添加、且预期数据量波动不大的场景
清空并真正重置容量(释放内存)
标准 API 没有直接“收缩容量”的方法,但可通过以下方式实现等效效果:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
新建空实例:
list = new ArrayList();—— 最简洁,原对象被丢弃,GC 可回收旧数组 -
先 clear 再 trimToSize:
list.clear(); list.trimToSize();——trimToSize()将底层数组缩容到当前size(即 0),实际将数组设为EMPTY_ELEMENTDATA或长度为 0 的数组(JDK 12+ 中会设为{}) - 注意:
trimToSize()不影响元素,必须配合clear()使用才能达到“清空 + 重置容量”效果
避免误区:removeAll 与循环 remove
不要用 removeAll(list) 或遍历调用 remove() 来清空:
立即学习“Java免费学习笔记(深入)”;
-
removeAll()时间复杂度高(O(n²)),且仍不改变容量 - 循环
remove(0)或remove(i)效率极低,每次删除都触发数组拷贝 - 这些方式既慢,又无法释放内存,纯属反模式
小技巧:复用时控制初始容量
如果反复清空后添加相似规模数据,可结合预估容量初始化,减少扩容次数:
- 创建时指定合理初始容量:
new ArrayList(estimatedSize) - 清空后若 size 长期很小,再调用
trimToSize()主动收缩 - 对内存敏感场景(如长期运行的缓存容器),定期检查并 trim 是有效手段

















