Bitset size()和length()的含义是什么,它们之间有什么区别?

5

我不太明白在BitSetsize()length()的不同含义。请查看下面的代码:

public class Sandbox {

   public static void main(String argv[]) 
   {
       BitSet bitSet1 = new BitSet(16);
       bitSet1.set(0);
       bitSet1.set(8);
       bitSet1.set(15);
       displayBitSet(bitSet1);
       
    
 
   }
   
   static void displayBitSet(BitSet bitSet)
   {
       for(int i=0;i<bitSet.size();i++)
       {
           boolean bit = bitSet.get(i);
           System.out.print(bit?1:0);
       }
       System.out.println(" "+bitSet.size()+" "+bitSet.length());
   }
 
}

输出结果如下:
1000000010000001000000000000000000000000000000000000000000000000 64 16

我想我会得到类似这样的东西
1000000010000001 16 16

这些末尾的零从哪里来?有人能给我解释一下吗?谢谢~~

如果你只想打印“你”的位,可以像这样循环:for(int i=0;i<bitSet.length();i++)。但是size()仍然会返回64。你使用的是64位机器吗? - jlordo
1
尾随的零来自BitSet的内部数据结构。即使您需要16位,它也会分配64位,但可能只允许您使用前16位。bitSet1.set(28);会导致错误吗? - jlordo
"BitSet是Java中的BitArray等价物吗?" - 不是。BitSet不能包含等价项,而BitArray可以...而且我认为64是缓冲区大小。如果你向集合中添加太多的内容,那么大小必须自动更改。 - Aliaksei Bulhak
bitSet1.set(28); 不会导致任何错误...有趣的是,当我尝试 bitSet1.set(64); 时,输出如下:10000000100000010000000000001000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000 128 65 - coffeeak
我认为,就像Aleksei所说的那样,大小会自动改变。 - coffeeak
我正在修改您的标题。Google认为这篇文章是关于BitSet文档的。 - Robert Harvey
2个回答

4
答案很简单,BitSet 构造函数生成的是足够大的东西,实际上它会选择最适合的内部大小。在您的情况下,这是64位,请参见JavaDoc

4
如果您查看BitSet#size的文档,它会说:

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

对于BitSet#length

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

因此,如果要获取位集中实际的数量,应使用BitSet.length。因为BitSet.size返回占用内存的BitSet实例。

另外,根据文档

请注意,大小与位集的实现相关,因此它可能随实现而更改

因此,在您的情况下,大小为64位,当您在索引大于指定长度的位置设置位时,它可以自动更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接