在相等的情况下缓存并仅使用一个对象 - 相等的对象应该获得引用

时间:2014-10-27 12:23:12

标签: java

我有一个KeyObject消耗了相当多的内存。 KeyObject还有一个hashValue和一个equals方法。

现在我想在我的内存中只保存一次唯一的KeyObject,并在相等的情况下使用对该对象的引用(等于==)。

我以为我可以使用Set但是我无法获得原始的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 - &gt;每个largeMap一个,但只有一个KeyObject(a.equals(b))就足够了,并使用第二个map的引用。

所以我想要这样的事情:

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 个答案:

答案 0 :(得分:0)

您可以使用其中键与值相同的HashMap<KeyObject,KeyObject>

  • if (map.contains(b))会告诉您缓存中是否包含密钥。
  • map.get(b)会给你那把钥匙。
  • 如果地图没有包含该密钥,请将其放在那里 - map.put(b,b)