2014-10-27 58 views
0

我有一個KeyObject消耗一定量的內存。 KeyObject也有一個hashValue和一個equals方法實現。在平等的情況下緩存和使用一個對象 - 相同的對象應該得到引用

現在我想只在我的記憶中保存每一個唯一的KeyObject,並且只要在相等(等於==)的情況下使用對這個對象的引用。

我以爲我可以使用一套,但我不能得到原來的KeyObject。我只能用新的替換現有的。

這裏是我的意思是在pseude代碼:

Keybject a = new Keybject("a"); 
Keybject b = new Keybject("a"); 
boolean thisIsTrue = a.equals(b); 
boolean thisIsFalse a == b; 

Map<KeyObject, Value> largeMapA = new HashMap<>(); 
Map<KeyObject, Value> largeMapB = new HashMap<>(); 

largeMapA.put(a, "value a"); 
largeMapB.put(b, "value b"); 

現在我有大KeyObject兩次 - >爲每個largeMap,但它足以只有一個KeyObject(a.equals(B ))並使用第二張地圖的參考。

所以我想是這樣的:

KeyObject b = if there is already a equal object ("a") in my "cache" then use "a" 
largeMapA.put(a, "value a"); 
largeMapB.put(b, "value b"); // Now I have ONE large KeyObject 
          // this is just a reference to a 

自帶的心中唯一的唯一的解決辦法是循環進入largeMapA並覺得有平等鍵代替B:

for (KeyObject ko : largeMapA.keySet()) { 
    if (ko.equals(b)) { 
    b = ko; 
    break; 
    } 
} 

但這似乎不是一個高性能的解決方案...

+1

這是幾乎可以肯定是一個非常不成熟的優化。不要擔心這一點,直到你用一個探查器證明這實際上是一個重大問題之前,讓你的代碼變得更加複雜。一般來說,如果您的對象可能都是平等和非常大的,那麼您的核心數據模型就會出現問題。 – chrylis 2014-10-27 12:25:50

回答

0

您可以使用一個HashMap<KeyObject,KeyObject>其中密鑰與該值相同。

  • if (map.contains(b))會告訴你,如果你的緩存包含密鑰。
  • map.get(b)會給你那個關鍵。
  • 如果地圖不包含關鍵的,你把它放在那裏 - map.put(b,b)
+0

HashSet沒有#get()這是excactly我來自哪裏... – KIC 2014-10-27 12:30:06

+0

@KIC我的錯誤。我改變了我的回答 – Eran 2014-10-27 12:33:54

+0

需要擔心的是內存泄漏。這保留了應用程序生命週期中使用的所有密鑰。第二個重大問題是線程安全。 – 2014-10-27 12:42:26

相關問題