能,但需集合实现Collection接口且未被不可变包装;调用后对象仍存在、引用不变、容量不释放,但size变为0;不可变集合或代理集合调用会抛UnsupportedOperationException。

clear() 方法能清空所有 Java 集合吗?
能,但前提是该集合实现了 Collection 接口且未被不可变包装(如 Collections.unmodifiableList())。几乎所有标准集合类(ArrayList、HashSet、LinkedHashMap 等)都支持 clear(),但数组、基本类型容器(如 int[])、或第三方不可变集合(如 Guava 的 ImmutableList)不支持。
调用 clear() 后,集合对象本身还存在吗?
存在,且引用不变——只是内部元素全部被移除,size() 变为 0,但集合实例仍是原对象,内存地址没变。这点常被误认为“集合被销毁”。
-
clear()不释放集合底层数组/哈希表的容量(capacity),例如ArrayList的elementData数组仍保留原大小 - 若需真正释放内存(如大集合后续不再使用),可手动赋值为
null或新建实例:list = new ArrayList<>();
- 对
ConcurrentHashMap等并发集合,clear()是线程安全的,但不保证原子性:其他线程可能在清空中看到部分为空的状态
clear() 和重新 new 一个集合有什么区别?
关键差异在对象身份、容量保留与性能开销:
-
clear()保持原对象引用,适合复用场景(如循环中反复填充/清空) -
new ArrayList()创建新对象,旧对象等待 GC;若原集合很大,clear()比重建更快(避免重复分配数组) -
LinkedList.clear()时间复杂度是 O(n),因为要逐个断开节点引用;而ArrayList.clear()是 O(n) 但实际很快(只遍历设 null 引用,不 resize) - 注意:若集合含大量自定义对象,
clear()不会触发其finalize()或清理逻辑,仅解除引用
哪些情况下 clear() 会抛异常?
常见于受保护或代理集合:
立即学习“Java免费学习笔记(深入)”;
- 不可变集合:
Collections.unmodifiableSet(set).clear()抛UnsupportedOperationException - 某些框架封装集合(如 MyBatis 返回的只读结果集)可能重写
clear()并直接 throw - 同步包装器(如
Collections.synchronizedList(list))本身支持clear(),但需确保调用时持有锁(否则可能与其他操作冲突) - 检查是否可修改:可先尝试
collection instanceof List && !(collection instanceof RandomAccess)不靠谱,应依赖文档或捕获异常
最容易被忽略的是:clear() 不影响集合的迭代器状态。已创建的 Iterator 在调用 clear() 后继续 next() 会抛 ConcurrentModificationException(除非是 CopyOnWriteArrayList 这类特殊实现)。










