补充地图

时间:2012-10-05 18:33:44

标签: java memory map

我们有两个互补的地图代码,如下所示:

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);

我们遇到了这个应用程序的内存问题。看来这里有很多重复。有没有办法让这个内存更有效?我们可以使用一些单一的结构?我意识到这可能是以时间效率为代价的,所以我对权衡利弊感兴趣。

3 个答案:

答案 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)

你也可以使用apache commons BidiMap.

BidiMap公开了一个方法inverseBidiMap(),该方法可以获取此地图的视图,其中键和值相反。

希望有所帮助!