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

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

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,895评论 18 399
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 5,238评论 0 6
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    叶总韩阅读 10,529评论 0 41
  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 5,932评论 0 2
  • 酷狗做到今天已经11年了,PC端跟移动端达到了4亿月活跃的规模,能做到这样是不容易的,为什么能做到这样呢,我想跟我...
    丶追杀那只熊阅读 4,758评论 0 5