2013-03-01 58 views
5

我有一個HashMap<MyClass,ArrayList<WeakReference<MyObject>>>變量。我可以比較java中的WeakReference變量嗎?

儘管weakrefences已從hashmap中清除,但我還希望能夠從HashMap中手動刪除「MyObject」。這是一箇中心聽衆對象。

當我將項目添加到鏈接到主HashMap的鍵的值ArrayList中,我使用.add(new WeakReference<MyObject>(owner))

,當我想從外部的地方去掉「自我」,我送「所有者」作爲參數,是真正的對象。那麼我怎樣才能從我的hashmap中手動刪除這個對象呢?我可以使用從傳入所有者參數生成的新WeakReference進行查詢嗎?舊的"new WeakReference<MyObject>(owner)"和新的"new WeakReference<MyObject>(owner)"是否相等?所以我可以從hashmap中刪除它。

+0

用於存儲弱引用的關鍵是什麼?使用相同的鍵從地圖中刪除弱引用實例。 – 2013-03-01 09:16:38

+0

他不是在地圖上調用'add',而是在'List'上調用。 – 2013-03-01 09:18:43

+0

@NarendraPathai key是一個定義偵聽器類型的枚舉。我無法刪除主鍵。我必須從ArrayList中移除偵聽器。因此,假設有許多鍵如「A_CHANGED,B_CHANGED」。 A_CHANGED可以有不限數量的不同對象,它們監聽A_CHANGED事件。所以我不能刪除A_CHANGED中的所有對象。 – frankish 2013-03-01 09:20:34

回答

6

將舊的 「新的WeakReference(所有者)」 和新的 「新 的WeakReference(老闆)」 相等?

不,他們不會平等。兩者都是不同的對象,並且equals方法在弱引用中不會被覆蓋。所以它默認檢查兩個引用是否相等,而不是。

建議:

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

你可以改變listmap並使用一些ID種事情對象作爲鍵弱引用。當所有者呼叫時,使用該對象的ID來刪除弱引用。

+0

因此,我必須將創建的WeakReference(所有者)返回給所有者,並且所有者將保留它的WeakReference? – frankish 2013-03-01 09:36:16

+0

平等和相同是不同的。 new String(「foo」)等於new String(「foo」),儘管它們是不同的對象。 – 2013-03-01 09:36:50

+0

@JBNizet是我的不好。我編輯帖子以反映更改。謝謝。 – 2013-03-01 09:46:21

4

不,因爲WeakReference及其父母Reference都不會覆蓋equals()方法。所以它繼承了Object的equals()方法,如果它們是同一個對象,則只考慮兩個對象是相等的。

+0

你對重寫equals有什麼想法嗎?我們將如何實現它? – frankish 2013-03-01 09:36:38

+0

我對弱引用知之甚少,不知道它是否是個好主意,或者不知道它的子類並覆蓋equals()或不是。我想這不是一個好主意,否則直接在WeakReference中完成。在列表中找到您要查找的那個,然後將其刪除。無論如何,當remove()被調用時,這就是列表所做的事情。 – 2013-03-01 09:39:46

+0

也許我可以將weakrefence返回給所有者本身,當它試圖將自己添加到此列表中時?那麼它可以直接使用該引用來刪除它自己? – frankish 2013-03-01 09:41:33

2

明顯的選項沿列表循環,並且(如果你正在檢查的是兩個變量指向相同的對象owner.equals(reference.get())owner == reference.get())與每一個參考的參照物比較目標客體。