2012-04-20 17 views
1

私は65,536と65,536を測定し、同じ座標を共有することができない多くのオブジェクトによって数えられる座標空間の数を持っています。これを考えると、ハッシュを作るintに座標を作る2つのshortを組み合わせることによって、各オブジェクトの固有のハッシュを保証することができます。この場合、どのようなHashMapのようなコレクションを使用しますか?

これらのオブジェクトへの参照を格納するために、私は現在、カスタム不変PointクラスをキーとしてHashMapを使用しています。しかし、私はこれらの座標空間全体を一度に利用し始めているので、メモリ使用量を減らす方法を見始めました。

JavaのHashMapのは、どのように動作するかの私の理解では基本的なものですが、私は多くのメモリ効率的なバージョンを使用している可能性のように、私は、各オブジェクトに一意のハッシュを保証できることを考えると、それが思われる:

  • doesnの」複数のオブジェクトを含めることができますトンの使用バケット
  • 入れて、ハッシュを使用しての代わりに、キー

は、HashMapのようなコレクションが存在するか使用してオブジェクトを取得することはできますか?

編集:座標空間はスパースで、約2000-3000個のオブジェクトで実行されます。

+0

... – Rich

+0

まあ非常に少なくとも私が欲しい/必要65,536余分いけないので、私は、単一のアレイを使用します配列オブジェクトです(2次元配列は実際には配列の配列です)...しかし、それでもmemeoryには余分なスペースが確保されますが、座標空間ごとに2000〜3000個のオブジェクトしかなく、配列は4,294,967,296の参照のためにメモリを予約します – Numeron

+1

@Numeron - この[スパース行列に関する説明](http://stackoverflow.com/questions/390181/sparse-matrices-arrays-in-java)を参照してください。メモリの効率は重要なので、それはあなたのプロジェクトに行く方法かもしれません。 – Perception

答えて

4

あなたはtrove4jからTIntObjectHashMapまたはTIntXxxxHashMapを使用することができます。あなたが代わりに2次元配列を使用することができ

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

バケツに関するあなたの声明は誤解に基づくものです。ハッシュバケットには、指定されたハッシュコードを持つすべてのアイテムが含まれているわけではありません。それらには、の項目がすべて含まれており、共通のハッシュコードの機能が含まれています。例えば、そのような関数の単純な例は、単にモジュロ演算子であるかもしれません。 2^32の異なるコードがありますが、HashMapには100個のバケットしかない可能性があります。単一項目のバケットを使用すると、ハッシュコードをインデックスとしてオブジェクトを効果的に配列に配置していることになります。

32ビット整数をキーとして使用した特殊マップのもう1つの考え方は実際には機能し、メモリ使用量を少し減らすことになりました。 Peter Lawreyは彼の答えに優れた提案をしています。

+0

ええと、いくつかの説明のおかげで、私はあなたが言っているものを得ると思う。私のJavaブックのいくつかを読み返す必要があります...今まで、HashMapsは基本的に魔法を使っていました。 – Numeron

関連する問題