是否有可能在JVM中创建一个内存有效的位序列?

时间:2017-03-12 09:25:44

标签: scala jvm boolean bit bitset

我有一段代码考虑了一定数量的功能,其中每个功能都是布尔值。我正在寻找最有效的方法来存储一组这样的功能。我最初的想法是尝试将这些存储为BitSet。但后来,我意识到这个实现是meant to be used to store numbers in bit format而不是操纵每一位,这是我想要做的事情(参见打开和关闭任何功能的效果)。然后我考虑使用布尔数组,但显然它实际需要JVM uses much more memory for each Boolean element than the one bit

因此,我留下了一个问题:存储一组我想要作为独立位而不是某些数字的构建块的位的最有效方法是什么?

1 个答案:

答案 0 :(得分:2)

请参阅此问题:boolean[] vs. BitSet: Which is more efficient?

根据Peter Lawrey的答案,布尔[] (不是 Boolean [] )是你的方法,因为它的值可以被操纵,它每位只需 一个字节的内存来存储。考虑到JVM应用程序无法在一位内存中存储一​​个位并让它直接(类似于数组)被操纵,因为它需要一个指针来查找该位的地址,并且最小的可寻址单元是字节。

您引用的站点已声明可变 BitSet java.util.BitSet 相同。您无法在Java中执行任何在Scala中无法做到的事情。但是既然你使用的是Scala,你可能想要一个安全的实现,这可能意味着甚至是多线程的。可变数据类型不适合这种情况。因此,我只需使用不可变的 BitSet 并接受内存开销。

但是, BitSets 有其限制(源自 int 的最大数量)。如果您需要更大的数据大小,可以使用 LongBitSets ,它们基​​本上是 Map< Long,BitSet> 。如果您需要更多空间,可以将它们嵌套在另一个地图 Map< Long,LongBitSet> 中,但在这种情况下,您需要使用两个或更多标识符( longs

相关问题