1

65,536 x 65,536の座標空間がいくつかあり、2つが同じ座標を共有できない多くのオブジェクトが配置されています。これを考えると、座標を作成する2つのショートを組み合わせて、ハッシュを作成するintにすることで、オブジェクトごとに一意のハッシュを保証できます。

これらのオブジェクトへの参照を保存するために、私は現在、カスタムの不変のPointクラスをキーとして持つHas​​hMapを使用しています。しかし、私はこれらの座標空間の多くを一度に利用し始めたので、メモリ使用量を削減する方法を検討し始めました。

JavaのHashMapがどのように機能するかについての私の理解は基本ですが、オブジェクトごとに一意のハッシュを保証できることを考えると、はるかにメモリ効率の高いバージョンを使用できるようです。

  • 複数のオブジェクトを含むことができるバケットを使用しません
  • キーの代わりにハッシュを使用してオブジェクトを配置および取得できます

そのようなHashMapのようなコレクションは存在しますか?

編集:座標空間はまばらで、1つあたり約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 の異なるコードが考えられますが、a にHashMapは (たとえば) 100 個程度のバケットしかない可能性があります。単一項目のバケットを使用すると、ハッシュコードをインデックスとしてオブジェクトを効果的に配列に入れることになります!

ここで、キーとして 32 ビット整数を使用する特殊なマップの別のアイデアが実際に機能し、メモリ使用量を少し削減します。Peter Lawrey は、彼の回答に優れた提案をしています。

于 2012-04-20T10:58:25.547 に答える