我们有两个互补的地图代码,如下所示:
private final Map<Integer, String> idToName = new HashMap<Integer, String>();
private final Map<String, Integer> nameToID = new TreeMap<String, Integer>();
每当我们把东西放在一个中时,我们也会把另一个(键和值反转)放在另一个中:
nameToID.put(name, id);
idToName.put(id, name);
我们遇到了这个应用程序的内存问题。看来这里有很多重复。有没有办法让这个内存更有效?我们可以使用一些单一的结构?我意识到这可能是以时间效率为代价的,所以我对权衡利弊感兴趣。
答案 0 :(得分:5)
这正是Guava's BiMap
的作用,尽管你可以获得更多的内存效率。 BiMap
的最大优点不是内存效率,而是“它确保值是唯一的,你不能忘记更新逆映射。”
BiMap<Integer, String> idToName = HashBiMap.create();
idToName.put(1, "foo");
idToName.inverse(); // returns a BiMap mapping "foo" to 1
idToName.inverse().put("bar", 2); // idToName now has an extra mapping 2 -> "bar"
(披露:我向Guava捐款。)
答案 1 :(得分:0)
您可以考虑使用Google Guava的BiMap类(docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/BiMap.html),但我不知道它会更有记忆效率。
private final Map<Integer, String> idToName = new BiMap<Integer, String>();
private final Map<String, Integer> nameToID = idToName.inverse();
您只需要添加到idToName
地图:
idToName.put(name, id);
答案 2 :(得分:0)