2011-03-18 23 views
0

我有一个ByteBuffer(它实际上表示整数)的数组。我想要单独的独特的&阵列中的非唯一ByteBuffers(即整数)。因此,我用这类型的HashSet的:
HashSet<ByteBuffer> columnsSet = new HashSet<ByteBuffer>()ByteBuffer(实际上是整数)的HashSet从一个ByteBuffer数组中分离唯一的和非唯一的元素

只是想知道,如果HashSet是这样做的好办法?当我这样做的时候,我需要支付更多的费用,如果我这样做了Integer,那么这个费用是ByteBuffer

(其实我读从DB串行数据需要被写入该操作因此,我想避免的ByteBuffer到整数和背部之间的序列化和反序列化后回来了!)

您在此感谢想法。

+1

所以*每个* ByteBuffer表示**一个**整数? – 2011-03-18 15:03:16

+0

是的,每个'bytebuffer'都是一个'integer'!存储在数据库中的整数值被反序列化为字节缓冲区,然后对其进行操作..然后将字节缓冲区保存回数据库。 – 2011-03-18 18:11:29

回答

0

首先,它会工作。 equals()两个ByteBuffer的开销肯定会更高,但可能不足以抵消无需反序列化的好处(尽管我不完全确定这是否会是一个很大的问题)。

我敢肯定,性能会渐进地相同,但更高效的内存解决方案是对数组进行排序,然后对其进行线性排序并测试连续的元素是否相等。

一个例子,假设你的缓冲区包含以下内容:

1 2 5 1 

排序是:

1 1 2 5 

一旦你开始迭代,你ar[0].equals(ar[1]),你知道这是重复的。只要继续下去,直到n-1

0

创建ByteBuffer比从重用的ByteBuffer读取/写入要贵得多。

存储整数最有效的方法是使用int类型。如果你想要一组这些,你可以使用使用int原语的TIntHashSet。您可以使用O(1)预先分配的对象执行多个读取/反序列化/存储和反向操作。

0

集合通常在equals()hashCode()方法上运行,因此性能影响将通过实现存储在集合中的对象来实现。

看着ByteBufferInteger人们可以看到,在Integer这些方法的实施更简单(对于equals()return value;hashCode()只是一个INT比较)。因此,您可以说Set<ByteBuffer>的成本高于Set<Integer>

但是,如果此成本高于序列化和反序列化成本,我现在无法告诉您。

事实上,我只是去更可读的代码,除非你真的有性能问题。在这种情况下,我只是尝试两种方法,并采取更快的方法。

相关问题