我应该在这种情况下使用什么类似HashMap的集合?

时间:2012-04-20 10:53:36

标签: java collections hashmap

我有许多坐标空间,分别为65,536乘65,536,并且由许多物体填充,其中没有两个可以共享相同的坐标。鉴于此,我可以通过组合两个使坐标成为int的短路来保证每个对象的唯一哈希值。

要存储对这些对象的引用,我目前正在使用带有自定义不可变Point类作为键的HashMap。然而,由于我开始一次性利用大量的这些坐标空间,我已经开始研究减少内存使用的方法。

我对java的HashMap如何工作的理解是基本的,但考虑到我可以保证每个对象的唯一哈希,似乎我可以使用更高内存效率的版本:

  • 不使用可包含多个对象的存储桶
  • 可以使用哈希而不是使用密钥来放置和获取对象

是否存在类似HashMap的集合?

编辑:坐标空间稀疏,每个运行大约2000-3000个对象。

2 个答案:

答案 0 :(得分:4)

您可以使用trove4j中的TIntObjectHashMap或TIntXxxxHashMap:

private final TIntIntHashMap map = ...

public void putInt(int x, int y, int value) {
   int index = (x << 16) + y;
   map.put(index, value); // only uses primitives.
}

public int getInt(int x, int y) {
   int index = (x << 16) + y;
   return map.get(index);
}

答案 1 :(得分:2)

你关于水桶的陈述掩盖了一个误解。散列桶不包含具有给定散列码的所有项;它们包含所有具有哈希码功能的项目。例如,这种函数的一个简单示例可能只是模运算符。您有2 ^ 32个不同的可能代码,但HashMap可能只有(例如)100个桶左右。使用单项存储桶意味着您有效地将对象放入一个以哈希码作为索引的数组中!

现在,只使用32位整数作为密钥的专用映射的另一个想法实际上是可行的,并且稍微减少了内存使用量。 Peter Lawrey在回答中提出了一个很好的建议。