2016-12-02 55 views
1

我正计划使用BitSet来操纵字节[]中的位,因为存在一个库。Java BitSet size()行为

但是,从byte []创建一个BitSet后,BitSet的最小大小为64,否则最终为零。 是否有必须有8个字节的要求? 另外,等于零的byte []将始终显示为零大小。我认为它仍然会输出字节数组的大小?

即。

BitSet bs1 = BitSet.valueOf(new byte[] {0, 0, 0, 0, 0, 0, 1}); // bs1.size() == 64 
BitSet bs2 = BitSet.valueOf(new byte[] {0, 0, 0, 0, 0, 0, 0, 1}); // bs2.size() == 64 
BitSet bs3 = BitSet.valueOf(new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 1}); // bs3.size() == 128 
BitSet bs4 = BitSet.valueOf(new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0}); // bs4.size() == 0 
System.out.print(bs1.size() + " " + bs2.size() + " " + bs3.size() + " " + bs4.size()); 

我可能最终会写我自己的功能,但我很好奇为什么发生这种情况。

谢谢!

+0

以及阅读Javadoc,源代码是随时可用的:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/BitSet .java - 注意这个实现将这些位存储为'long'数组。但是 - 在依赖实现细节之前仔细考虑。文档中描述的行为是保证保持真实的。 – slim

回答

4

刚刚看过的Javadoc:

size()返回的实际使用空间的位数由此BitSet表示位值。

事情是:BitSet预先分配空间;这就是size()告诉你的!它不会不是告诉你有多少位完全“放入”它!

换句话说:BitSet以64个“空”位开始;只要你“投入”一个需要超过64个价值的价值;你去128位的“分配”。另请注意,size()取决于您的JDK对BitSet的实现。

你可能想看看length()或分别。 valueOf();可能会帮助你解决你的问题。

+0

这是正确的答案(阅读Javadoc!),但我建议还提到'length()'并引用关于大小的部分是依赖于实现的。 – slim

+0

我读过关于size()的部分,但是,我没有阅读valueOf()上的javadoc,它显示了原始BitSet大小以及它不能等于零的事实。谢谢! – eggplant

+0

@eggplant相应地更新了我的答案。如果你的问题得到解决;随时接受我的答案,然后;-) – GhostCat