熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

Java中的BitSet

2013-11-15 09:49:42  來源: JSP教程 

  BitSet實際是由二進制位構成的一個Vector如果希望高效率地保存大量開-關信息就應使用BitSet它只有從尺寸的角度看才有意義如果希望的高效率的訪問那麼它的速度會比使用一些固有類型的數組慢一些
  此外BitSet的最小長度是一個長整數(Long)的長度這意味著假如我們准備保存比這更小的數據位數據那麼BitSet就顯得浪費了所以最好創建自己的類用它容納自己的標志位
  在一個普通的Vector中隨我們加入越來越多的元素集合也會自我膨脹在某種程度上BitSet也不例外也就是說它有時會自行擴展有時則不然而且Java的版本似乎在這方面做得最糟它的BitSet表現十分差強人意(Java已改正了這個問題)下面這個例子展示了BitSet是如何運作的同時演示了版本的錯誤
  
  //: Bitsjava
  // Demonstration of BitSet
  import javautil*;
  
  public class Bits {
   public static void main(String[] args) {
    Random rand = new Random();
    // Take the LSB of nextInt():
    byte bt = (byte)randnextInt();
    BitSet bb = new BitSet();
    for(int i = ; i >=; i)
     if((( << 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 >=; i)
     if((( << 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。TW.WiNgwiT.COm每一個都會轉換成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。
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19186.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.