顾名思义,就是位集合(bit set),是从JDK 1.0就出现的东西,后面的版本又慢慢强化。

我们说学习一样东西,最好是场景驱动 - 要考虑它的使用场景,这样才有意义。

那么,BitSet的应用场景是什么?

我个人的体会是,用于统计,统计整数相关的东西。但这么说未免太空泛了,我们先来看一下它的用法吧。

直接上例子:

@Test
public void test(){
BitSet set = new BitSet(10); //10 bits set //set() 设为true
set.set(0);
set.set(1);
set.set(5);
System.out.println(set); // 应该是列出值为true的那些位的坐标! // 8 bit >> 1 byte, 就是说截取8位,转成byte。 就是0010 0011 >>
System.out.println(Arrays.toString(set.toByteArray()));
// 64 bit >> 1 long
System.out.println(Arrays.toString(set.toLongArray()));
}
 

方法体内:

第一部分是创建对象,该构造方法接收一个int来指明位集合的长度 -- [0,0,0,0,  0,0,0,0,  0,0]。注意,此时所有位的值都是false - 这里的false不是Java中的概念,而是对应bit的0 -- true对应1。

第二部分是设置位值,BitSet#set(int n) 方法是将第n位的值设为true(1) --  [1,1,0,0,  0,1,0,0,  0,0]!直接输出的话,就是位值为true的索引:{0, 1, 5}!

第三部分,是将所有位转成byte数组、long数组,并输出对应的数组内容。转成byte[],其实就是每8位切分一下;转成long[]就是每64位切分一下!那么[1,1,0,0,  0,1,0,0,  0,0]就是[(1,1,0,0,  0,1,0,0,)  0,0],也就是[35]!注意计算方式。

再来一个逆向的例子:

@Test
public void test1(){
// 和test()中的set.toByteArray()刚好相反,这里是1 byte >> 8 bits! 需要确认90对应的低8bit 还是高8bit。
BitSet bitSet = BitSet.valueOf(new byte[]{90, 92, 95, 97});
System.out.println(bitSet); //{1, 3, 4, 6, 10, 11, 12, 14, 16, 17, 18, 19, 20, 22, 24, 29, 30} //截取下上面的输出即可知道90对应的是低位还是高位
BitSet bs = new BitSet(8);//
bs.set(1);
bs.set(3);
bs.set(4);
bs.set(6);
System.out.println(Arrays.toString(bs.toByteArray()));//90 - 事实证明是小端?
}

这里就是将byte[]或long[]中的每个值拆成8bit或者64bit的形式,填入相应的位置(8*index ~ 8*(index+1),或64*index ~ 64*(index+1))。

然后,具体的计算就跟2进制转8进制或16进制一样,每三位一算,或每四位一算!只不过这里是每8位或每64位一算!

那回到前面的主题,这有什么应用场景?

举个例子,比如你要生成随机数,整数,不多,就 0~1亿范围吧,生成的数量不定,现在让你列出所有生成的数值,甚至按照大小排序,你怎么做?

难道是搞一个HashSet<Integer>?哪怕是按照int类型的长度,最大也会4B*100000000 ≈ 381 MB,性能绝对是个问题,还得排序,估计得到地老天荒。

用BitSet就方便多了,怎么用呢?

直接搞一个 new BitSet(100000000),内存不过是 100000000/8 B ≈ 12 MB!

然后,每得到一个随机数,就将相应的位设为true即可,bs.set(num)!

最后,直接输出所有位值为true的索引即可,无论从小到大,还是反过来,都很简单!

怎么样,有没有一种惊喜的感觉,哈哈,起码我觉得很惊喜。

噢对了,这货C++中也有。

至于BitSet其他的操作,留给各位自行探索吧。

BitSet 是个好东西的更多相关文章

  1. Java BitSet解决海量数据去重

    先提一个问题,怎么在40亿个整数中找到那个唯一重复的数字? 第一想法就是Set的不可重复性,依次把每个数字放入HashSet中,当放不去进去的时候说明这就是重复的数字,输出这个数字. if(hs.co ...

  2. bitset学习

    bitset是个好东西.嗯.贼sao~ 很早就讲过但是我并没有弄懂.(现在也不敢说明白) 首先bitset是有常数的,而且常数并不能忽略不计——$(\frac{1}{32})$ 目前我也只是会bits ...

  3. [2016北京集训试题6]mushroom-[bitset]

    Description Solution bitset是个好东西啊..强行压位什么的真是够orz. 由于所有的蘑菇上房间的长相是一样的,我们针对每个房间,算出它到根节点的bitset和以它为根的子树的 ...

  4. 发现的好东西——bitset

    先向各位大佬介绍一个水题 任何一个正整数都可以用2的幂次方表示.例如 137=2^7+2^3+2^0 同时约定方次用括号来表示,即a^b 可表示为a(b). 由此可知,137可表示为: 2(7)+2( ...

  5. lucene底层数据结构——底层filter bitset原理,时间序列数据压缩将同一时间数据压缩为一行

    如何联合索引查询? 所以给定查询过滤条件 age=18 的过程就是先从term index找到18在term dictionary的大概位置,然后再从term dictionary里精确地找到18这个 ...

  6. Codeforces Gym 100342J Problem J. Triatrip bitset 求三元环的数量

    Problem J. TriatripTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/att ...

  7. 一道面试题与Java位操作 和 BitSet 库的使用

    前一段时间在网上看到这样一道面试题: 有个老的手机短信程序,由于当时的手机CPU,内存都很烂.所以这个短信程序只能记住256条短信,多了就删了. 每个短信有个唯一的ID,在0到255之间.当然用户可能 ...

  8. 黑科技--位集--bitset

    自从上次网赛发现这么个东西之后,深深地感受到了bitset的强大,0.0. 正常的bool占用1字节空间,bitset可以把这个缩到1bit,空间上8倍优化.正常用起来可能会跟位运算状态压缩类似,但是 ...

  9. Bitset([HZOI 2015]偏序++)

    Bitset简介 下面介绍C++ STL 中一个非常有用的东西: Bitset 类似于二进制状压,它可以把信息转化成一个01串存储起来 定义方法: 首先要#include<bitset>或 ...

随机推荐

  1. 行为类模式(十一):访问者(Visitor)

    定义 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. UML 优点 符合单一职责原则:凡是适用访问者模式的场景中,元素类中需要封装在访问者中的 ...

  2. matlab问题集总

    每次更新一点,慢慢增加 nargin nargin是用来判断输入变量个数的函数,这样就可以针对不同的情况执行不同的功能.通常可以用他来设定一些默认值,如下面的函数. 例子,函数test1的功能是输出a ...

  3. Lua string.gsub (s, pattern, repl [, n])

    lua的string函数导出在string module中.在lua5.1,同时也作为string类型的成员方法,因此,我们既可以写成string.gsub (s,……), 也可以s:gsub(). ...

  4. sql2005分页储存过程和C#分页类

    1.sql2005分页储存过程 --sql2005,qq524365501 create Procedure up_page2005 ), -- 表名称 ), -- 列 ), -- 主键,用于统计总数 ...

  5. 将map中的查询参数拼装到URL路径中

    被调接口的URL路径: //被调接口url String apiUrl = "http://api.open.xxxxxx.com/implatform/interview/send?acc ...

  6. Linux命令格式及帮助命令详解

    昨天看了一个教程,关于Linux命令的,本来以为当是复习随便看看的,结果看了不禁汗颜,这个真挺有学问的,很多东西都是我还不知道的,故此做总结,此文适合于对Linux命令有一定了解但又不是很深入的孩子, ...

  7. Excel2013 破解(编辑工作表受保护)密码

    在日常工作中,大家有时会遇到过这样的情况:使用Excel编制的报表.表格.程序等,在单元格中设置了公式.函数等,为了防止其他人修改您的设置或者防止您自己无意中修改,您可能会使用Excel的工作表保护功 ...

  8. LeetCode: Binary Tree Maximum Path Sum 解题报告

    Binary Tree Maximum Path SumGiven a binary tree, find the maximum path sum. The path may start and e ...

  9. weblogic域备份脚本

    一直一来,由于空间问题,weblogic域很少备份,偶尔会手动备份一次,这运维做得不称职,今天有时间,写个小脚本来定时备份. 1.脚本备份文件目录结构 [weblogic@mylinux ~]$ tr ...

  10. UEFI格式预装win8安装win7

    如果本本预装的是win8,而且是较新款的机型,那么当你想要格掉win8,装win7系统时就会遇到问题.主要有两个: 1)安装win7时,笔记本无法识别系统光盘或u盘启动盘 ,提示:屏幕显示“image ...