我是初学程序员,最近我遇到了一个数据结构BitArray

时间:2012-11-06 07:00:19

标签: java bitset

我是一名初学程序员,最近我在阅读一本书时编写了一个数据结构BitArray(编程珍珠,更为精确)。我想在BitArray上学习和练习一点,因为我之前并不知道它。我在C#中做了一个简单的实现(比如创建BitArray,设置值等等),但是当我想尝试使用Java时,它抱怨说BitArray是未知的。所以我在网上搜索并将BitArray更改为BitSet。 BitSet是否相当于Java中的BitArray? 另外,我不太了解BitSet中size()和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

这些尾随零的来源是什么?谁可以给我解释一下这个?感谢~~

2 个答案:

答案 0 :(得分:4)

答案非常简单BitSet构造函数只是说它生成的东西足够大到给定的大小,实际上它需要一些最匹配的内部大小。

在您的情况下,这是64位,请参阅JavaDoc

答案 1 :(得分:4)

如果您看到BitSet#size的文档,则说:

  

返回此BitSet实际使用的空间位数   代表比特值。集合中的最大元素是大小 - 第1   元件。

对于BitSet#length

  

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

因此,如果您想获得位集中BitSet.length的实际数量,则应使用bits。因为,BitSet.size会返回BitSet实例占用的内存。

另外,根据documentation

  

请注意,大小与位集的实现有关,所以   它可能会随着实施而改变

所以你的情况下的大小是64位,当你设置索引大于指定长度的位时,它会自动改变。