Java.util.BitSet可以按位存储。 计算机中一个字节(byte)占8位(bit),我们java中数据至少按字节存储的, 比如一个int占4个字节。 如果遇到大的数据量,这样必然会需要很大存储空间和内存。 如何减少数据占用存储空间和内存可以用算法解决。 java.util.BitSet就提供了这样的算法。
比如有一堆数字,需要存储,source=[3,5,6,9] 用int就需要4*4个字节。 。 如果用java.util.BitSet,则会少很多,其原理是:
先找出数据中最大值maxvalue=9
声明一个BitSet bs,它的size是maxvalue+1=10
遍历数据source,bs[source[i]]设置成true.
最后的值是:
[0,0,0,1,0,1,1,0,0,1]3569
这样一个本来要int型需要占4字节共32位的数字现在只用了1位! 比例32:1
这样就省下了很大空间。
BitSet是位操作的对象,值只有0或1即false和true,最常用的地方是用户、系统开关,原理是内部维护了一个long数组,初始只有一个long,所以BitSet最小的size是64,当随着开关越来越多,会动态扩充,最终内部是由N个long来存储,这些对操作都是透明的。
final BitSet bs = new BitSet();
默认的构造函数声明一个64位的BitSet,值都是false。 如果你要用的位超过了默认size,它会再申请64位,而不是报错
public void set(int pos): 位置pos的字位设置为true。
public void set(int bitIndex, boolean value) 将指定索引处的位设置为指定的值。
public void clear(int pos): 位置pos的字位设置为false。
public void clear() : 将此 BitSet 中的所有位设置为 false。
public int cardinality() 返回此 BitSet 中设置为 true 的位数。
public boolean get(int pos): 返回位置是pos的字位值。
public void and(BitSet other): other同该字位集进行与操作,结果作为该字位集的新值。
public void or(BitSet other): other同该字位集进行或操作,结果作为该字位集的新值。
public void xor(BitSet other): other同该字位集进行异或操作,结果作为该字位集的新值。
public void andNot(BitSet set) 清除此 BitSet 中所有的位,set - 用来屏蔽此 BitSet 的 BitSet
public int size(): 返回此 BitSet 表示位值时实际使用空间的位数。
public int length() 返回此 BitSet 的“逻辑大小”:BitSet 中最高设置位的索引加 1。
bites.toByteArray();
bites.toLongArray();
BitSet.valueOf(byte[]);
//一个字符串中用了哪些字符@TestpublicvoidcharCalc(){finalString wordstr ="hello, world 你好吗";finalBitSet bs =newBitSet();for(charc : wordstr.toCharArray()){ bs.set(c);//System.out.println("-------------");} System.out.println(bs.size()); System.out.println(bs.length());for(inti=0; i maxnum)break; bs.set(x); j++; } }for(inti=2;i<=maxnum;i++){if(!bs.get(i)) System.out.println(i); } }
//现在有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来@Testpublicvoidfindrandom(){
System.out.println("开始生成随机数 "+newDate());finalint[] numbers =newint[10000000];for(inti=0;i
numbers[i] = RandomUtils.nextInt(1,100000001);
}
System.out.println("生成随机数完毕 "+newDate());////////////////////////finalBitSet bs =newBitSet(numbers.length);for(intn : numbers){
bs.set(n);
}
System.out.println("设置位图完毕 "+newDate());for(inti=1;i<100000001;i++){if(!bs.get(i)) System.out.println(i);//没有在随机数中//if(bs.get(i)) System.out.println(i); //在随机数中}
System.out.println("打印完毕 "+newDate());
}