`
raymond.chen
  • 浏览: 1418156 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Bitset数据结构的使用

    博客分类:
  • Java
阅读更多

Bitset是Java中的一种数据结构。Bitset中主要存储的是二进制位,做的也是位运算,每一位只用来存储0,1值,主要用于对数据的标记。

 

BitSet是位操作的对象,值只有0或1(即true 和 false),内部维护一个long数组,初始化只有一个long segement,所以BitSet最小的size是64;随着存储的元素越来越多,BitSet内部会自动扩充,一次扩充64位,最终内部是由N个long segement 来存储。

 

Bitset的基本原理是,用1位来表示一个数据是否出现过,0为没有出现过,1表示出现过。默认情况下,BitSet所有位都是0即false。

 

JDK选择long数组作为BitSet的内部存储结构是出于性能的考虑,在and和or的时候减少循环次数,提高性能。

 

应用场景:海量数据去重、排序、压缩存储

 

优点:按位存储,内存占用空间小

缺点:线程不安全

 

基本操作:

BitSet bitSet1 = new BitSet();
BitSet bitSet2 = new BitSet();

for(int i=0; i<15; i++){
	if(i%3 != 0 && i%5 != 0) bitSet1.set(i);
	if(i%2 == 0) bitSet2.set(i);
}

bitSet1.and(bitSet2); //交集
bitSet1.or(bitSet2); //并集
bitSet1.andNot(bitSet2); //返回左BitSet中,不在右BitSet的数据
bitSet1.xor(bitSet2); //返回左右BitSet中,不在左右BitSet的数据
bitSet1.intersects(bitSet2); //两边都有位值为true的数据,则返回true

bitSet1.set(100); //标识索引为100的位有数据
System.out.println(bitSet1.get(100)); //获取索引为100的位是否有数据

System.out.println(bitSet1.size()); //集合大小,64的倍数
System.out.println(bitSet1.length()); //数据集的长度
System.out.println(bitSet1.cardinality()); //位值为true的个数

bitSet1.set(100);

//返回指定index及其后的第一个位值为true的index,找不到返回-1
System.out.println(bitSet1.nextSetBit(0));  
System.out.println(bitSet1.nextSetBit(14));
System.out.println(bitSet1.nextSetBit(15));

//返回指定index及其前的第一个位值为true的index,找不到返回-1
System.out.println(bitSet1.previousSetBit(200)); 
System.out.println(bitSet1.previousSetBit(14));
System.out.println(bitSet1.previousSetBit(0));

 

去重排序:

ThreadLocalRandom rnd = ThreadLocalRandom.current();
		
//数据初始化
int arrayLength = 10;
int[] array = new int[arrayLength];
for(int i=0; i<arrayLength; i++){
	array[i] = rnd.nextInt(arrayLength * 10);
}
System.out.println(Arrays.toString(array));

//将数据放入BitSet中,会去重
BitSet bitSet = new BitSet();
for(int i=0; i<array.length; i++){
	bitSet.set(array[i]);
}

//递增排序显示
int i = 0;
for(i=bitSet.nextSetBit(0); i>=0; i=bitSet.nextSetBit(i+1)){
	System.out.print(i + ", ");
}
System.out.println();

//递减排序显示
for(i=bitSet.previousSetBit(bitSet.length()); i>=0; i=bitSet.previousSetBit(i-1)){
	System.out.print(i + ", ");
}
System.out.println();

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics