我是一名初学程序员,最近我在阅读一本书时编写了一个数据结构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
这些尾随零的来源是什么?谁可以给我解释一下这个?感谢~~
答案 0 :(得分:4)
答案非常简单BitSet
构造函数只是说它生成的东西足够大到给定的大小,实际上它需要一些最匹配的内部大小。
在您的情况下,这是64位,请参阅JavaDoc
答案 1 :(得分:4)
如果您看到BitSet#size
的文档,则说:
返回此BitSet实际使用的空间位数 代表比特值。集合中的最大元素是大小 - 第1 元件。
返回此BitSet的“逻辑大小”:最高的索引 设置BitSet中的位加一。如果BitSet包含no,则返回零 设置位。
因此,如果您想获得位集中BitSet.length
的实际数量,则应使用bits
。因为,BitSet.size
会返回BitSet
实例占用的内存。
另外,根据documentation:
请注意,大小与位集的实现有关,所以 它可能会随着实施而改变
所以你的情况下的大小是64位,当你设置索引大于指定长度的位时,它会自动改变。