文档章节

Java.util包下BitSet的用法

吴小河
 吴小河
发布于 2016/07/12 21:02
字数 468
阅读 465
收藏 21

    BitSet:是一个字节集合,用它可以表示整数和进行求两个集合的交集、并集等运算。

    我们知道,计算机存储的最小单位是比特bit,而我们在java程序中的最小单位是字节Byte,他们之间的换算关系是1Byte=8bit。BitSet是根据比特所在的位置表示整形数据大小。例如:16在第16个位置,5在第5个位置,因此下面的BitSet可以表示集合{5,16}

    

    

    通过分析BitSet的源代码,我们知道,BitSet提供两个构造函数,一个是BitSet(),不带参数,一个是BitSet(int nbits);如果我们使用不带参数的构造函数创建BitSet对象,则创建一个默认长度为64比特bit的对象,这个对象可以表示的数据大小就是1~64,不过即使我们放入大于64的数据也没有关系,因为BitSet是自增长的,最大值可以是Integer.MAX_VALUE=2147483647。

    知道了表示方法,对它的作用就不难理解了,比方说上面的集合与{2,23,48}求并集:则变成了比特码的或运算。

00000000 00000000 00000000 00000000 00000000 00000000 10000000 00100000    集合{5,16}

00000000 00000000 10000000 00000000 00000000 01000000 00000000 00000010    集合{2,23,48}

或运算后的结果就是

00000000 00000000 10000000 00000000 00000000 01000000 10000000 00100010,所以结果就是{2,5,16,23,48}

其它更大的数字无非就是比特码更长。

注意:

如果创建创建一个最大位数的BitSet集合BitSet bitSet = new BitSet(Integer.MAX_VALUE);

         会报如下错误

         Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

   at java.util.BitSet.initWords(BitSet.java:144)

   at java.util.BitSet.<init>(BitSet.java:139)

   at Test.main(Test.java:10)

         这说明,java 堆heap内存不足,可以通过如下方式更改:

   

    其它报java.lang.OutOfMemoryError: Java heap space错误的时候也可以这样更改

© 著作权归作者所有

吴小河
粉丝 3
博文 5
码字总数 2517
作品 0
朝阳
程序员
私信 提问
加载中

评论(2)

吴小河
吴小河

引用来自“一生做恶”的评论

如果有代码例子会更好
只有理解了原理,写代码就非常的简单了,以下是实例代码:
import java.util.BitSet;


public class Test {
  public static void main(String[] args) {
    BitSet bitSetA = new BitSet();
    bitSetA.set(5);
    bitSetA.set(16);
    System.out.println("集合A里面的数据是:");
    System.out.println(bitSetA);
    
    BitSet bitSetB = new BitSet();
    bitSetB.set(2);
    bitSetB.set(23);
    bitSetB.set(48);
    System.out.println("集合B里面的数据是:");
    System.out.println(bitSetB);
    
    bitSetA.or(bitSetB);
    System.out.println("求并集之后的集合数据是");
    System.out.println(bitSetA);
  }
}
输出结果为:
集合A里面的数据是:
{5, 16}
集合B里面的数据是:
{2, 23, 48}
求并集之后的集合数据是
{2, 5, 16, 23, 48}
一生做恶
一生做恶
如果有代码例子会更好
小朋友学Java(13):控制台输入

C语言用scanf来输入,C++用cin来输入,java则用Scanner来输入。 程序 运行结果 说明 Scanner这个类是Java 1.5引入的,具体位于java.util.Scanner中。所以开头用import java.util.*; 表示把j...

翡翠森林Z
2017/12/17
0
0
Java编程学习:集合框架详解

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
2018/05/30
0
0
BZOJ4810 / 由乃OI2017 由乃的玉米田【莫队+Bitset】

Description 给你一个序列 ,长度为 ,有 次操作,每次询问一个区间是否可以选出两个数它们的差为 ,或者询问一个区间是否可以选出两个数它们的和为 ,或者询问一个区间是否可以选出两个数它...

OwenOwl
2017/10/19
0
0
利用Redis BitMap 统计用户活跃指标

bitMap原理 : 如下: index 从 0 到 9 ,依次对应到一个bit位上,如果index 代表用户id,bit位上的0 1分表 代表用户是否登录; 1 0 1 1 0 1 1 0 1 1 0 1 2 3 4 5 6 7 8 9 redis数据结构中 st...

robin-yao
2015/04/11
0
2
redis相关知识积累

在学习redis时总结的问题 setbit的作用 参考自: https://www.zhihu.com/question/27672245 作者:Andy 链接:https://www.zhihu.com/question/27672245/answer/123641959 来源:知乎 著作权归......

wangtenfee
2017/05/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ubuntu或ubuntu kylin优麒麟中安装QQ、wechat微信、百度网盘

从中国国内的地址下载deepin wine,码云上的。这样网速比较快。然后,按照说明向下安装。 https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu...

gugudu
33分钟前
1
0
基于redis分布式锁实现“秒杀”

最近在项目中遇到了类似“秒杀”的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓“秒杀”的基本思路。 业务场景 所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源...

别打我会飞
52分钟前
14
0
Zookeeper的实践指南

本章重点 1.数据存储2.基于Java API初探Zookeeper的使用3.深入分析Watcher机制的实现原理4.Curator客户端的使用,简单高效 数据存储 事务日志快照日志运行时日志 bin/zookeepe...

须臾之余
56分钟前
2
0
MySQL mybatis Point类型数据

MySQL中的point用于表示GIS中的地理坐标,在GIS中广泛使用 如何写入mysql,如下图: CREATE TABLE `test-point` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序号', `point` ......

张欢19933
今天
3
0
设计模式-适配器模式

适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入...

HOT_POT
今天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部