java

位置:IT落伍者 >> java >> 浏览文章

Java中的BitSet


发布日期:2023年04月16日
 
Java中的BitSet

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。               

上一篇:Java和.NET互操作究竟有什么用?

下一篇:利用Java实现zip压缩/解压缩(1)