代码之家  ›  专栏  ›  技术社区  ›  committedandroider

为什么我的位集大小为0?

  •  1
  • committedandroider  · 技术社区  · 7 年前

        ByteBuffer buffer = .......
        System.out.println("Array length is " + buffer.array().length);
        BitSet bitSet = BitSet.valueOf(buffer.array());
        System.out.println("Bit set size is " + bitSet.size());
    

    当我执行代码时,我看到ByteBuffer的数组长度是6100,这意味着它由6100个字节支持。这些字节都是0。然而,我也看到位集大小是0。这对我来说没有意义。(大小应该是6100*8)。

    我查看了 valueOf

    我犯的第一个错误是使用位集的长度。长度是0,这很有意义,因为所有位都是0。size函数“返回此位集实际使用的空间位数,以表示位值。”size函数不应该在这里返回6100*8吗?

    更新:我刚刚尝试将所有1放入bytebuffer,现在得到的数组长度为7000,位集大小为7232

    1 回复  |  直到 7 年前
        1
  •  2
  •   Chris Nauroth    7 年前

    BitSet 实现的目的不是直接保持缓冲区的大小等于传递来初始化它的数组。相反,它在内部保持了足够的缓冲空间来跟踪最高的位 BitSet#get 假设如果传递的位索引高于其当前缓冲区空间中保持的值,则该位必须关闭。

    JavaDocs中有几个关于“大小”或“长度”的相关语句。从类级别的JavaDocs BitSet :

    BitSet#length :

    (还请注意,在所有位都关闭的极端情况下,它返回零。)

    从…起 BitSet#size

    返回此位集实际使用的空间位数,以表示位值。集合中的最大元素是size-1st元素。

    如果您对更深入的研究感兴趣,我还建议您查看

    http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/3462d04401ba/src/share/classes/java/util/BitSet.java

    有趣的部分是 set get ,编码为返回 false words 成员变量)。