我可以比较java中的WeakReference变量吗?

时间:2013-03-01 09:12:56

标签: java hashmap weak-references

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

尽管从hashmap中清除了弱反射,但我还希望能够从HashMap中手动删除“MyObject”。这是一个中心侦听器对象。

当我将项目添加到链接到主hashmap键值的arraylist时,我使用.add(new WeakReference<MyObject>(owner))

当我想从外部地方删除“self”时,我发送“owner”作为真实对象的参数。那么如何从我的hashmap中手动删除这个对象呢?我可以使用从传入所有者参数生成的新WeakReference进行查询吗?旧"new WeakReference<MyObject>(owner)"和新"new WeakReference<MyObject>(owner)"是否相等?所以我可以从hashmap中删除它。

3 个答案:

答案 0 :(得分:7)

  将旧的“新WeakReference(所有者)”和新的“新”   WeakReference(所有者)“相等?

不,它们不相等。两者都是不同的对象,并且在弱引用中不会覆盖equals方法。所以它默认检查两个引用是否相等而不是。

建议:

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

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

答案 1 :(得分:6)

不,因为WeakReference及其父Reference类都不会覆盖equals()方法。所以它继承了Object的equals()方法,它只考虑两个对象是否相同,如果它们是同一个对象。

答案 2 :(得分:2)

显而易见的选择是沿着列表循环,并将目标objet与每个Reference(owner.equals(reference.get())owner == reference.get()的指示对象进行比较,如果你检查的是两个变量都指向同一个对象)。