BitSet實際是由“二進制位”構成的一個Vector。如果希望高效率地保存大量“開-關”信息,就應使用BitSet。它只有從尺寸的角度看才有意義;如果希望的高效率的訪問,那麼它的速度會比使用一些固有類型的數組慢一些。
此外,BitSet的最小長度是一個長整數(Long)的長度:64位。這意味著假如我們准備保存比這更小的數據,如8位數據,那麼BitSet就顯得浪費了。所以最好創建自己的類,用它容納自己的標志位。
在一個普通的Vector中,隨我們加入越來越多的元素,集合也會自我膨脹。在某種程度上,BitSet也不例外。也就是說,它有時會自行擴展,有時則不然。而且Java的1.0版本似乎在這方面做得最糟,它的BitSet表現十分差強人意(Java1.1已改正了這個問題)。下面這個例子展示了BitSet是如何運作的,同時演示了1.0版本的錯誤:
//: Bits.java // Demonstration of BitSet import java.util.*; public class Bits { 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); // Without the following, an exception is thrown // in the Java 1.0 implementation of BitSet: // b1023.set(1023); b1023.set(1024); System.out.println("set bit 1023: " + b1023); } 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); } } ///:~
隨機數字生成器用於創建一個隨機的byte、short和int。每一個都會轉換成BitSet內相應的位模型。此時一切都很正常,因為BitSet是64位的,所以它們都不會造成最終尺寸的增大。但在Java 1.0中,一旦BitSet大於64位,就會出現一些令人迷惑不解的行為。假如我們設置一個只比BitSet當前分配存儲空間大出1的一個位,它能夠正常地擴展。但一旦試圖在更高的位置設置位,同時不先接觸邊界,就會得到一個惱人的違例。這正是由於BitSet在Java 1.0裡不能正確擴展造成的。本例創建了一個512位的BitSet。構建器分配的存儲空間是位數的兩倍。所以假如設置位1024或更高的位,同時沒有先設置位1023,就會在Java 1.0裡得到一個違例。但幸運的是,這個問題已在Java 1.1得到了改正。所以如果是為Java 1.0寫代碼,請盡量避免使用BitSet。