1

我有许多坐标空间,尺寸为 65,536 x 65,536,并由许多对象填充,其中没有两个可以共享相同的坐标。鉴于此,我可以通过将生成坐标的两条短裤组合成生成散列的 int 来保证每个对象的唯一散列。

为了存储对这些对象的引用,我目前正在使用带有自定义不可变 Point 类的 HashMap 作为键。然而,自从我开始一次使用大量这些坐标空间以来,我开始寻找减少内存使用的方法。

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

  • 不使用可以包含多个对象的存储桶
  • 可以通过使用散列而不是使用键来放置和获取对象

是否存在这样一个类似 HashMap 的集合?

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

4

2 回答 2

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);
}
于 2012-04-20T10:59:06.290 回答
2

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

现在,仅使用 32 位整数作为键的专用映射的另一个想法实际上可以工作,并减少内存使用量。彼得劳里在他的回答中有一个很好的建议。

于 2012-04-20T10:58:25.547 回答