weakset 的 has() 是唯一检测对象是否存在的方法,必须传入同一对象引用,不支持原始值,返回布尔值反映对象是否仍被持有且未被垃圾回收。

用 has() 方法检测对象是否在 WeakSet 中,这是唯一可用的判断方式。
has() 是唯一入口
WeakSet 没有 size、不能遍历、不提供 keys() 或 values(),所以无法“查列表”或“数个数”。has(value) 是它对外暴露的三个方法(add、delete、has)中,唯一用于存在性判断的。
- 必须传入**同一个对象引用**,不是内容相同的新对象
- 原始值(如字符串、数字)会直接报错,WeakSet 只接受对象
- 返回布尔值:
true表示当前仍被持有(未被垃圾回收),false表示不存在或已被回收
引用相等才是关键
WeakSet 的 has() 不比较属性或结构,只看内存地址是否一致。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
weakSet.has(obj)→true -
weakSet.has({id: 1})→false(哪怕内容一样,也是新对象) -
weakSet.has(obj2)→false,即使obj2和obj属性完全相同
检测结果隐含生命周期信息
返回 false 并不一定代表你没加过它——可能加过,但该对象已无其他引用,被自动清理了。
- 这正是 WeakSet 的设计目的:不阻碍 GC,让检测结果自然反映对象存活状态
- 适合做临时标记,比如“这个 DOM 元素是否已被处理过”,卸载后无需手动清理
- 不适合做持久状态记录,因为无法保证下次调用
has()还能拿到true
典型使用模式
常见写法是配合 add() 一起用,形成“标记-检查”闭环:
- 先
weakSet.add(obj)标记对象 - 后续任意位置调用
weakSet.has(obj)快速确认是否还“有效” - 不需要也不应该手动
delete(),除非你明确要提前解除标记(但通常没必要)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










