为什么我的 BitSet 的大小为 0?

Why does my BitSet have a size of 0?

这是我的代码。我想要做的是使用 BitSet 处理来自我的 ByteBuffer 的字节。 ByteBuffer 是从 DynamoDB 加载的(使用 DynamoDBMapper)

    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 的文档,"Returns a new bit set containing all the bits in the given byte array." 的描述对我正在尝试做的事情很有意义。

我犯的第一个错误是使用位集的长度。长度为 0,这是有道理的,因为所有位都是 0。大小函数"returns the number of bits of space actually in use by this BitSet to represent bit values."这里不应该是大小函数return6100*8吗?

更新:我刚刚尝试将所有 1 放入字节缓冲区,现在得到一个长度为 7000 的数组和一个位设置大小为 7232

BitSet 未实现直接维护一个大小等于传入数组以对其进行初始化的缓冲区。相反,它在内部维护足够的缓冲区 space 来跟踪打开的最高位。对于高于此值的任何位,BitSet#get 等方法假设如果传递的位索引高于其当前缓冲区 space 中维护的位索引,则该位必须关闭。

JavaDocs 中有几个关于 "size" 或 "length" 的相关声明。来自 BitSet 的 class 级 JavaDocs:

Every bit set has a current size, which is the number of bits of space currently in use by the bit set. Note that the size is related to the implementation of a bit set, so it may change with implementation. The length of a bit set relates to logical length of a bit set and is defined independently of implementation.

来自 BitSet#length:

Returns the "logical size" of this BitSet: the index of the highest set bit in the BitSet plus one. Returns zero if the BitSet contains no set bits.

(另请注意,在所有位关闭的极端情况下,它 return 为零。)

来自 BitSet#size:

Returns the number of bits of space actually in use by this BitSet to represent bit values. The maximum element in the set is the size - 1st element.

如果您有兴趣进行更深入的研究,我还建议您查看 BitSet:

的 OpenJDK 代码

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

有趣的部分是 set,它根据需要动态扩展缓冲区 space 以设置特定位,以及 get,它被编码为 return false如果请求的位索引超出当前缓冲区容量(words成员变量)。