在Java中,我能否比较WeakReference变量?

6

我有一个HashMap<MyClass,ArrayList<WeakReference<MyObject>>>的变量。

虽然弱引用已经从哈希映射表中清除,但我还想能够手动从HashMap中删除"MyObject"。这是一个中心监听对象。

当我向与主哈希映射键的值相关联的数组列表中添加项目时,我使用.add(new WeakReference<MyObject>(owner))

当我想要从外部地方删除"self"时,我将“owner”作为参数发送,它是真正的对象。那么我该如何手动从我的哈希映射表中删除此对象?我可以通过从传入的owner参数生成新的WeakReference来查询吗?旧的"new WeakReference<MyObject>(owner)"和新的"new WeakReference<MyObject>(owner)"是否相等?这样我就可以将其从哈希映射表中删除。


用于存储弱引用的关键字是什么?使用相同的关键字将弱引用实例从映射中移除。 - Narendra Pathai
他没有在 map 上调用 add,而是在 List 上调用。 - Adam Arold
@NarendraPathai键是一个枚举,它定义了监听器的类型。我不能删除主键。我必须从ArrayList中删除监听器。因此,假设有许多键,如“A_CHANGED,B_CHANGED”。A_CHANGED可以有无限数量的不同对象监听A_CHANGED事件。因此,我不能从A_CHANGED中删除所有对象。 - frankish
3个回答

7

旧的 "new WeakReference(owner)" 和新的 "new WeakReference(owner)" 是否相等?

不相等。 它们是不同的对象,并且弱引用未覆盖 equals 方法。因此,它默认检查两个引用是否相等,但它们并不相等。

建议:

Map<MyClass,Map<String,WeakReference<MyObject>>>

您可以将list更改为map,并在对象中使用一些ID类型的东西作为弱引用的键。当所有者调用时,使用该对象的ID来删除弱引用。


那么,我必须将创建的WeakReference(owner)返回给owner,而owner将保留它的WeakReference? - frankish
相等和相同是不同的。new String("foo") 等于 new String("foo"),尽管它们是不同的对象。 - JB Nizet
@JBNizet 是的,我的错。我编辑了帖子以反映这些更改。谢谢。 - Narendra Pathai
在我看来,使用id作为键来存储弱引用比将弱引用传递给调用者要好得多。 - Narendra Pathai

6
不行,因为既WeakReference也不是其父类Reference覆盖了equals()方法。因此,它从Object继承equals()方法,仅在两个对象是同一对象时才认为它们是相等的。

你有关于重写equals方法的任何想法吗?我们该如何实现它? - frankish
我对弱引用的了解不足,无法确定是否应该子类化并覆盖equals()。 我猜这不是一个好主意,否则WeakReference直接就会这么做了。循环遍历列表以查找所需项并删除它。当调用remove()时,列表本身就会执行这个操作。 - JB Nizet
也许当对象尝试将自身添加到此列表时,我可以返回对其自身的弱引用?这样它就可以直接使用该引用来删除自己? - frankish

2

显而易见的选项是遍历列表,并将目标对象与每个引用的参考对象进行比较(owner.equals(reference.get())owner == reference.get() 如果你要检查的是两个变量是否指向同一个对象)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接