Java BitSet

361人阅读 评论(0) 收藏 举报
分类:

BitSet是一个按需增长的位向量,位向量指有大小端的由0,1组成的串。此类是线程不安全的。
索引从0开始,负数索引会异常,位向量的每个位都有一个boolean值,默认情况下,初始值都是false。
BitSet 表示位值时实际使用空间的位数由size()方法返回,返回值是64的倍数,最小是64。length()方法返回的是实际使用的位大小,结果是最高设置位的索引加1。
BitSet还可以进行逻辑运算,比如与、或、异或。
BitSet的toString方法返回的是设置了true值的所有索引。
BitSet有两个构造方法:一个默认构造,默认是64位。一个可以传初始大小的构造。它的大小是按需增长的,如果考虑到性能,最好选择一个初始大小。

import java.util.BitSet;

public class Demo {

	public static void main(String args[]) {
		BitSet bs1 = new BitSet(16);
		BitSet bs2 = new BitSet(16);
		BitSet bs3 = new BitSet();
		BitSet bs4 = new BitSet();

		// intersects,如果两个BitSet中至少有一位双方都设置为true,则返回true
		bs3.set(1);
		bs3.set(2);
		bs4.set(1);
		System.out.println(bs3.intersects(bs4));// 输出true

		// length/size
		bs3.set(100);// 设置索引为100的位为true
		System.out.println(bs3.size());// 输出128,因为我们在索引100设置了值,因此64容纳不下,只能选择64*2=128才能够容纳。
		System.out.println(bs3.length());// 输出101,表示使用了101位二进制。

		// toString,输出值为true的索引,set方法用于设置索引的值,有几个重载,具体看文档
		for (int i = 0; i < 16; i++) {
			if ((i % 2) == 0)
				bs1.set(i);
			if ((i % 3) == 0)
				bs2.set(i);
		}
		System.out.println(bs1);// 输出{0, 2, 4, 6, 8, 10, 12, 14}
		System.out.println(bs2);// 输出{0, 3, 6, 9, 12, 15}

		// flip,即某位的值如果是true则设为false,false则设为true,第一个参数表示从哪个索引开始,第二个表示到哪个索引的前一个索引结束
		bs1.flip(0, bs1.length());
		bs2.flip(0, bs2.length());
		System.out.println(bs1);// 输出{1, 3, 5, 7, 9, 11, 13}
		System.out.println(bs2);// 输出{1, 2, 4, 5, 7, 8, 10, 11, 13, 14}

		// clear,所有位设为false
		bs1.clear();
		bs2.clear();
		System.out.println(bs1);// 输出{}
		System.out.println(bs2);// 输出{}

		// and/or/xor 这些方法改变的是当前BitSet而不是目标BitSet(即方法参数BitSet)
		// 重置bs1和bs2
		for (int i = 0; i < 16; i++) {
			if ((i % 2) == 0)
				bs1.set(i);
			if ((i % 3) == 0)
				bs2.set(i);
		}
		bs2.and(bs1);
		System.out.println(bs2);// 输出{0, 6, 12}

		// 重置bs1和bs2
		for (int i = 0; i < 16; i++) {
			if ((i % 2) == 0)
				bs1.set(i);
			if ((i % 3) == 0)
				bs2.set(i);
		}
		bs2.or(bs1);
		System.out.println(bs2);// 输出{0, 2, 3, 4, 6, 8, 9, 10, 12, 14, 15}

		// 重置bs1和bs2
		for (int i = 0; i < 16; i++) {
			if ((i % 2) == 0)
				bs1.set(i);
			if ((i % 3) == 0)
				bs2.set(i);
		}
		bs2.xor(bs1);
		System.out.println(bs2);// 输出{2, 3, 4, 8, 9, 10, 14, 15}

		// get,获取指定索引的值
		System.out.println(bs2.get(3));// 输出true

		// cardinality,返回值为true的位数
		System.out.println(bs2.cardinality());// 输出3

		// 其他方法看文档
	}
}


排序

    public static void main(String[] args) {
        int[] ints = new int[]{22, 32, 1, 3, 2, 5, 99, 2, 6, 4};
        BitSet bitSet1 = new BitSet();
        for (int i = 0; i < ints.length; i++) {
            bitSet1.set(ints[i]);
        }

        for (int i = 0; i < bitSet1.length(); i++) {
            if (bitSet1.get(i) == true) {
                System.out.print(i + "\t");
            }
        }
    }
查看评论

Java学习指南系列(Java快速入门)

-
  • 1970年01月01日 08:00

java.util.BitSet 研究(存数海量数据时的一个途径)

java.util.BitSet可以按位存储。 计算机中一个字节(byte)占8位(bit),我们java中数据至少按字节存储的, 比如一个int占4个字节。 如果遇到大的数据量,这样必然会需要...
  • lushuaiyin
  • lushuaiyin
  • 2012-05-08 14:35:34
  • 24557

Java中BitSet的使用及详解

一. Bitset 基础 Bitset,也就是位图,由于可以用非常紧凑的格式来表示给定范围的连续数据而经常出现在各种算法设计中。上面的图来自c++库中bitset的一张图。 基本原理是,用1位来表示一...
  • u012736409
  • u012736409
  • 2016-12-19 10:29:45
  • 6212

Java BitSet(位集)

原理简介:         Java平台的BitSet用于存放一个位序列,如果要高效的存放一个位序列,就可以使用位集(BitSet)。由于位集将位包装在字节里,所以使用位集比使用Boolean对象的L...
  • caiandyong
  • caiandyong
  • 2016-06-03 19:27:12
  • 2973

java.util.BitSet 分析

我们知道bit-map在大数据处理方面有着很大的用途,比如
  • gyflyx
  • gyflyx
  • 2014-06-12 11:32:25
  • 4406

BitSet的原理解析

BitSet 类实现了一个按需增长的位向量。位 set 的每个组件都有一个boolean值。用非负的整数将BitSet的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或和逻...
  • Love_JavaProgram
  • Love_JavaProgram
  • 2015-12-27 15:46:27
  • 1472

Java Bitset和位运算

(1)BitSet类     大小可动态改变, 取值为true或false的位集合。用于表示一组布尔标志。    此类实现了一个按需增长的位向量。位 set 的每个组件都有一个 boolean...
  • jiafu1115
  • jiafu1115
  • 2011-11-08 16:00:45
  • 1016

java BitSet

一. Bitset 基础 Bitset,也就是位图,由于可以用非常紧凑的格式来表示给定范围的连续数据而经常出现在各种算法设计中。上面的图来自c++库中bitset的一张图。 基本原理是,用1位来表...
  • haojun186
  • haojun186
  • 2013-01-08 17:47:34
  • 4083

java的BitSet实现位排序算法,复杂度为O(n)

今天小树用Java语言写了个位排序算法,算法复杂度为O(n).import java.util.*;public class BitSort { public static void main...
  • qq_28511781
  • qq_28511781
  • 2017-04-29 14:23:57
  • 434

jdk之BitSet位运算解析

不久前项目中用到了BitSet,由于之前没怎么使用过它,所以为了强化,读了几篇分析BitSet源码的文章,算是熟悉了这个类的相关API。读完之后兴致冲冲,非常想要写一篇截止目前最走心的BitSet源码...
  • nmgrd
  • nmgrd
  • 2017-06-15 21:10:42
  • 383
    个人资料
    等级:
    访问量: 15万+
    积分: 1715
    排名: 2万+
    最新评论