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

时间:2017-07-06 22:58:18

标签: java bit bytebuffer bitset bitmask

这是我的代码。我想要做的是使用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的文档和"的描述。返回一个包含给定字节数组中所有位的新位集。"对我想要做的事情有意义。

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

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

1 个答案:

答案 0 :(得分:2)

BitSet未实现直接维护与传入的数组大小相等的缓冲区来初始化它。相反,它在内部保持足够的缓冲区空间来跟踪打开的最高位。对于任何比这更高的位,像BitSet#get这样的方法假设如果传递的位索引高于其当前缓冲区空间中维持的位数,则该位必须关闭。

JavaDocs中有几个关于" size"的相关陈述。或"长度"。来自BitSet的类级JavaDoc:

  

每个位集都有一个当前大小,即当前位集使用的空间位数。请注意,大小与位集的实现有关,因此它可能随实现而改变。位集的长度与位集的逻辑长度有关,并且与实现无关地定义。

来自BitSet#length

  

返回"逻辑大小"此BitSet:BitSet中最高设置位的索引加1。如果BitSet不包含设置位,则返回零。

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

来自BitSet#size

  

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

如果您对更深入的潜水感兴趣,我还建议您查看BitSet的OpenJDK代码:

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

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