0

私は s の配列を持っていますByteBuffer(実際には整数を表します)。配列内の一意の ByteBuffers と非一意の ByteBuffers (つまり、整数) を分離したい。したがって、私はこのタイプの HashSet を使用しています:
HashSet<ByteBuffer> columnsSet = new HashSet<ByteBuffer>()

HashSetそうするのが良い方法かどうか知りたかっただけですか?ByteBufferそして、もし私がのためにそれをやったなら、私はより多くのコストを支払うことになりIntegerますか?

(実際には、この操作の後に書き戻す必要があるDBからシリアル化されたデータを読み取っているため、bytebufferからIntegerへのシリアル化と逆シリアル化を避けたいです!)

これについてのご意見をお待ちしております。

4

3 に答える 3

1

ByteBuffer の作成は、再利用された ByteBuffer からの読み取り/書き込みよりもはるかにコストがかかります。

整数を格納する最も効率的な方法は、int型を使用することです。これらのセットが必要な場合は、int プリミティブを使用する TIntHashSet を使用できます。O(1) 事前割り当てオブジェクトを使用して、複数の読み取り/デシリアライズ/ストアとリバースを実行できます。

于 2011-03-18T15:21:05.257 に答える
0

まず第一に、それは機能します。equals()on twoのオーバーヘッドByteBufferは間違いなく高くなりますが、逆シリアル化する必要がないことの利点を相殺するにはおそらく十分ではありません (ただし、それがそれほど大きな問題になるかどうかは完全にはわかりません)。

パフォーマンスが漸近的に同じになると確信していますが、よりメモリ効率の良い解決策は、配列を並べ替えてから、線形にステップスルーし、連続する要素が等しいかどうかをテストすることです。

たとえば、バッファーに次のものが含まれているとします。

1 2 5 1

並べ替え:

1 1 2 5

反復を開始すると、ar[0].equals(ar[1])これらが重複していることがわかります。までそのように続けてn-1ください。

于 2011-03-18T15:20:44.953 に答える
0

コレクションは通常、メソッドequals()hashCode()メソッドで動作するため、パフォーマンスへの影響は、コレクションに格納されているオブジェクトの実装によってもたらされます。

と を見るByteBufferInteger、 のこれらのメソッドの実装Integerがより単純であることがわかります ( と の int 比較が 1 つだけequals()ですreturn value;) hashCode()。したがって、Set<ByteBuffer>は よりもコストが高いと言えますSet<Integer>

ただし、このコストがシリアライゼーションおよびデシリアライゼーションのコストよりも高いかどうかは、現時点ではわかりません。

実際、パフォーマンスの問題が本当にない限り、私はもっと読みやすいコードを選びます。その場合は、両方の方法を試して、より高速な方を選択します。

于 2011-03-18T15:22:04.467 に答える