如果想要高效率地存储大量“开-关”信息,BitSet 是很好的选择。不过它的效率仅是对
空间而言。如果你需要高效率的访问时间,BitSet 比数组稍慢一点。
此外,BitSet 的最小容量是 long:64 bit。如果你存储的内容比较小,例如 8 bit,那么
BitSet 就浪费了一些空间。因此如果空间对你很重要,最好撰写自己的类,或者直接采用
数组来存储你的标志信息。
普通的容器都会随着元素的加入而扩充其容量,BitSet 也是。以下示范 BitSet 是如何工作
的:
//: c11:Bits.java
// Demonstration of BitSet.
import java.util.*;
public
class Bits {
public
static
void printBitSet(BitSet b) {
System.out.println("bits: " + b);
String bbits =
new String();
for(int j = 0; j < b.size() ; j++)
bbits += (b.get(j) ?
"1" : "0");
System.out.println("bit pattern: " + bbits);
}
public
static
void main(String[] args) {
Random rand = new Random();
// Take the LSB of nextInt():
byte bt = (byte)rand.nextInt();
BitSet bb = new BitSet();
for(int i = 7; i >= 0; i--)
if(((1 << i) & bt) != 0)
bb.set(i);
else
bb.clear(i);
System.out.println("byte value: " + bt);
printBitSet(bb);
short st = (short)rand.nextInt();
BitSet bs = new BitSet();
for(int i = 15; i >= 0; i--)
if(((1 << i) & st) != 0)
bs.set(i);
else
bs.clear(i);
System.out.println("short value: " + st);
printBitSet(bs);
int it = rand.nextInt();
BitSet bi = new BitSet();
for(int i = 31; i >= 0; i--)
if(((1 << i) & it) != 0)
bi.set(i);
else
bi.clear(i);
System.out.println("int value: " + it);
printBitSet(bi);
// Test bitsets >= 64 bits:
BitSet b127 = new BitSet();
b127.set(127);
System.out.println("set bit 127: " + b127);
BitSet b255 = new BitSet(65);
b255.set(255);
System.out.println("set bit 255: " + b255);
BitSet b1023 =
new BitSet(512);
b1023.set(1023);
b1023.set(1024);
System.out.println("set bit 1023: " + b1023);
}
}
///:~
随机数发生器被用来生成随机的 byte、short 和 int,每一个都被转换为 BitSet 中相应的
bit 模式。因为 BitSet 是 64bit 的,所以没有任何生成的随机数会导致 BitSet 扩充容量。
然后创建了一个 512bit 的 BitSet。构造器会分配比 bit 数大一倍的存储空间,不过你也可
以设定为 1024bit(或更大)。