BitSet

如果想要高效率地存储大量“开-关”信息,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(或更大)。


你可能感兴趣的:(BitSet)