Java BitSet大小大于在构造函数中设置的nbits

时间:2013-10-09 11:20:18

标签: java bitset

我正在创建一个具有固定位数的BitSet。 在这种情况下,持有二进制表示的String的长度为508个字符。

所以我按照以下方式创建BitSet:

BitSet bs = new BitSet(binary.length());
// binary.length() = 508

但是看看bs的大小我总是得到512的大小。我可以看到总共有4个Bits,其值为0。

可能对以下文档存在一些误解:

  

BitSet(int nbits)

     

创建一个位集,其初始大小足以显式表示索引在0到nbits-1范围内的位。

BitSet是否总是增强其大小,使其大小为2的幂或为什么它更大?

4 个答案:

答案 0 :(得分:3)

构造函数中的位数是一个大小提示,而不是对允许的位数的限制。 Bitset的size()实际上是它当前的容量,尽管规范比这更具弹性。

  

所以如果我通过另一个bitset,我不能依赖它的大小?可能还会添加一些位,或者它可能比“预期”更长?

正确,是的。

如果您想要逻辑大小(即设置的最高位索引),请使用length()方法,而不是size()方法。

  

如果length()给出了最高位设置,这对每种情况都无济于事。因为位置508上的“我的”最高位也可以是0。

在这种情况下,“set”表示“设置为1 / true”。因此,如果您的最高位(位置508)为零,length()将小于508.我不确定这是否有帮助。但是如果你有一个定义了最高位位置的概念,那么你需要将该位置表示为一个单独的值。

Bitset实际上被建模为可能无限的位数组,默认情况下初始化为全零。 (这就是没有“翻转整个Bitset”操作的原因。它会占用大量存储空间。)

答案 1 :(得分:2)

根据the documentation,内存中的实际大小取决于实现,因此您无法确切知道您将获得的size()。但是,作为用户,您不必担心它,因为BitSet的length()始终是准确的 - 即使内存中的大小较大,它也会返回实际使用的位数。

由于BitSet可以自动增长以容纳添加到它的任何数据,如果它使用类似于列表的增长策略,我会不会感到惊讶,因为列表往往使用增加的2的幂。但正如所说,这个事实是一个实现细节,它可能在每个地方和每次都不一样。

答案 2 :(得分:0)

这只是一个集合的提示(这适用于我认为的所有集合),所以它不必在添加元素后自行调整大小。例如,如果您知道您的集合最多可容纳100个元素,则可以将其大小设置为100,并且不会调整大小,这样可以提高性能。

答案 3 :(得分:0)

BitSet大小将设置为64的第一个倍数,该倍数等于或大于您用于' size'的数字。如果您指定的尺寸为' 508,你会得到一个实际大小为512的BitSet,这是64的下一个最高倍数。