Java BitSet 大小大于 Constructor 中设置的 nbts



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

所以我按以下方式创建位集:

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

但是看看 bs 的大小,我总是得到 512 的大小。我可以看到总是有 4 位,末尾附加值为 0。

也许对以下文档存在一些误解:

BitSet(int nbits(

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

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

构造函数中的位数是大小调整提示,而不是对允许位数的限制。 Bitset size()实际上是其当前容量,尽管规格比这更具橡胶性。

所以如果我被传递另一个位集,我不能依赖大小?也可能附加一些位,或者它可能比"预期"长?

正确,是的。

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

如果 length(( 给了我最高的位集,这在每种情况下都无济于事。因为位置 508 上的"我的"最高位也可以是 0。

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

集实际上被建模为一个潜在的无限位数组,默认初始化为所有零。 (这就是为什么没有"翻转整个位集"操作的原因。 它将使用大量的存储空间。

根据文档,内存中的实际大小取决于实现,因此您无法真正确定您将获得什么size()。但是,作为用户,您不必担心它,因为 BitSet 的length()始终是准确的 - 即使内存中的大小更大,它也会返回实际使用的位数。

由于 BitSet 可以自动增长以适应添加到其中的任何数据,因此如果它使用类似于列表的增长策略,我不会感到惊讶,列表倾向于使用增加的 2 次幂。但如前所述,这一事实是一个实现细节,可能并非每次都相同。

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

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

最新更新