美文网首页
java.util.BitSet处理海量数据【转】

java.util.BitSet处理海量数据【转】

作者: e237262360d2 | 来源:发表于2017-07-04 09:21 被阅读0次

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());

}

相关文章

网友评论

      本文标题:java.util.BitSet处理海量数据【转】

      本文链接:https://www.haomeiwen.com/subject/ztythxtx.html