5

我想知道 Scala 中 BitSet 的内存使用情况是多少。例如,如果我这样做:

  var bitArray:BitSet=new BitSet(10)
  bitArray.add(0)
  bitArray.add(2)
  bitArray.add(4)
  bitArray.add(6)
  bitArray.add(8)

这与包含偶数 0、2、4、6、8 的数组相比如何?

用二进制写一个数字怎么样:

  var bitArray:BitSet=new BitSet(32)
  bitArray.add(5)
  bitArray.add(3)
  bitArray.add(2)
  bitArray.add(1)
  bitArray.add(0)

这与数字 47 相比如何?

我在这里询问内存使用情况。但作为一个更开放的问题,如果您知道,BitSet 的优点/缺点或用途是什么(WR 到其他常见数据类型)。

谢谢,

4

1 回答 1

16

你可以在这里查看 Scala 2.8 中 BitSet 的实现:scala.collection.mutable.BitSet

它是基于 Long 数组实现的。数组的大小仅取决于其中存储的最大数。将其中存储的最高数字除以 64,向上取整,就得到了数组的大小。数组中的每个元素占用 8 个字节。

这意味着将其中存储的最大数字除以 8,大致得出 BitSet 的大小(以字节为单位)。“大致”是因为虚拟机内存管理开销,因为指向数组的指针也需要一些内存,并且因为数组本身有一些开销。

插入顺序或存储在 BitSet 中的实际元素数量对分配的内存大小没有影响。

对于您给出的两个示例,只需要一个 Long-element 来存储数字,使用 8 个字节的内存,因为在这两个示例中,最大数字都小于 64。

存储任意五个数字的 Ints 数组将消耗 5 * 4 字节 = 20 字节加上开销。要存储 n 个数字,您大约需要 n * 4 个字节。

因此,您将 (highestNumberStored / 8) 字节与 (countOfNumbersStored * 4) 字节进行比较。

于 2010-06-29T16:04:28.763 回答