0

我有一个ByteBuffers 数组(实际上代表整数)。我想在数组中分离唯一和非唯一的字节缓冲区(即整数)。因此,我正在使用这种类型的 HashSet:
HashSet<ByteBuffer> columnsSet = new HashSet<ByteBuffer>()

只是想知道是否HashSet是这样做的好方法?ByteBuffer如果我为 a 这样做,我是否会支付更多费用Integer

(实际上我正在从 DB 读取序列化数据,需要在此操作后写回,因此我想避免字节缓冲区到 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 比较 forequals()return value;for hashCode())。因此,您可以说 the 的Set<ByteBuffer>成本高于 a Set<Integer>

但是,我现在不能告诉你这个成本是否高于序列化和反序列化成本。

事实上,除非你真的遇到性能问题,否则我只会选择更具可读性的代码。在那种情况下,我会尝试两种方法并采用更快的方法。

于 2011-03-18T15:22:04.467 回答