clear()仅清空元素不缩容,要重置容量需clear()后调用trimtosize()或新建arraylist实例;前者使elementdata变为空数组,后者恢复默认初始容量。

Java 中 ArrayList 清空所有元素并重置容量,需分两步理解:清空元素用 clear(),但该方法不会释放底层数组内存(即不缩小容量);要真正重置容量(让内部数组变回初始大小或最小必要大小),需要手动创建新实例或通过技巧触发缩容。
直接清空元素(保留原容量)
clear() 是最常用、最安全的清空方式,它将所有元素设为 null,并将 size 置为 0,但底层 Object[] elementData 数组长度(capacity)保持不变:
ArrayList<string> list = new ArrayList(100); // 初始容量 100
list.addAll(Arrays.asList("a", "b", "c"));
System.out.println(list.size()); // 3
System.out.println(getCapacity(list)); // 100(需反射获取,ArrayList 无公开 capacity 方法)
list.clear();
System.out.println(list.size()); // 0
System.out.println(getCapacity(list)); // 仍为 100
</string>
彻底重置容量(释放内存,恢复小容量)
ArrayList 没有内置的“缩容”方法(如 trimToSize() 只能缩到当前 size,不能缩到初始容量),所以要真正重置容量,有以下实用方式:
-
新建一个空 ArrayList:最简单可靠。适用于你不需要复用原引用对象的场景:
list = new ArrayList();—— 容量回到默认 10(JDK 17+ 为 12,不同版本略有差异) -
先
clear()再trimToSize():把容量缩到当前 size(即 0),从而释放全部数组内存:list.clear(); list.trimToSize();—— 此时elementData变为长度为 0 的空数组({}),后续 add 会重新扩容 -
用
removeIf+ 恒真谓词(不推荐):语义不清且效率低,等价于clear(),不缩容
如何查看当前实际容量?(调试用)
ArrayList 未暴露容量字段,可通过反射临时获取(仅用于测试/诊断,生产慎用):
private static int getCapacity(ArrayList> list) {
try {
Field field = ArrayList.class.getDeclaredField("elementData");
field.setAccessible(true);
Object[] arr = (Object[]) field.get(list);
return arr.length;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
选哪种方式?看你的需求
如果只是业务逻辑上“清空数据”,用 clear() 就够了——轻量、高效、线程安全(在单线程下)。
如果集合长期存在、曾存过大量数据、且内存敏感(如服务端缓存、Android 低内存环境),建议 clear() + trimToSize() 或直接重建新实例,避免大数组驻留堆中。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











