HashMap.clear()仅断开自身对键值对的引用,不释放table数组内存,不触发回调,不保证对象被GC回收,适合复用场景。

HashMap 的 clear() 方法并不“逐个删除键值对”,而是直接重置内部状态,断开自身对所有元素的引用。
核心操作:清空哈希桶数组
源码中关键逻辑是遍历内部的 Node[] table 数组,把每个桶(bucket)位置设为 null:
- 将
size置为 0,表示当前无有效映射 - 将
modCount自增,维护结构修改计数(用于 fail-fast 检测) - 对
table数组每个索引执行tab[i] = null,切断链表或红黑树的入口引用
为什么不用遍历删除每个 Node?
因为 JVM 垃圾回收依赖可达性分析——只要 HashMap 不再持有任何 Node 的强引用,且这些 Node 的 key 和 value 也没有被其他对象引用,它们就会在下次 GC 时被自动回收。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
clear()不调用remove(),不触发afterNodeRemoval回调 - 不释放
table数组本身内存(数组对象仍存在),只清空其元素引用 - 不改变容量、负载因子等初始化参数,适合复用场景
注意:clear 不等于彻底释放内存
该方法仅解除 HashMap 自身的引用关系。若 key 或 value 被外部变量、静态集合、ThreadLocal、监听器等持有,对应对象仍不可达回收。
立即学习“Java免费学习笔记(深入)”;
- 例如:value 是一个大 byte[] 缓存,同时又被某个全局 Map 引用 →
clear()无效 - 若需确保释放,应配合将引用变量置为
null,或控制作用域(如局部变量自然出栈)
对比重新 new HashMap()
两者效果都使 map 变为空,但机制不同:
-
clear():复用原数组,仅清空内容,更快更轻量(尤其 table 已扩容较大时) -
new HashMap():分配新数组,旧table等待 GC;若频繁创建,可能增加 GC 压力 - 实际选型看场景:高频短生命周期推荐
clear();数据量波动极大时可考虑按需重建

















