顾名思义,就是位集合(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. spring cloud 项目相关集成简介

    Spring Cloud Config 配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储.Git以及Subversion. Spring Cloud Bus 事件.消 ...

  2. Warning Template OS Linux: /etc/passwd has been changed on {HOST.NAME} {monitor:vfs.file.cksum[/etc/passwd].diff(0)}>0 Unknown

    # ll -h /etc/passwd -rw-r--r-- 1 root root 1.5K Apr 15 16:10 /etc/passwd 让zabbix 可以登录服务器 # mkdir /ho ...

  3. Nginx配置优化参考

    Nginx配置优化参考                                                                                          ...

  4. [Windows Azure] Configuring and Deploying the Windows Azure Email Service application - 2 of 5

    Configuring and Deploying the Windows Azure Email Service application - 2 of 5 This is the second tu ...

  5. 每日英语:How Pop Culture Influences Chinese Travelers

    Where are Chinese tourists going to next? Pop culture may hold some clues, from blockbuster rom-com ...

  6. python(44):array和matrix的运算

    在NumPy中,array用于表示通用的N维数组,matrix则特定用于线性代数计算.array和matrix都可以用来表示矩阵,二者在进行乘法操作时,有一些不同之处. 使用array时,运算符 *  ...

  7. hive外部表删除遇到的一个坑

    hive外部表删除遇到的一个坑 操作步骤 创建某个表(create external table xxx location xxx) 插入数据(insert xxx select xxx from x ...

  8. 关于Android开发的一些个人总结(2016.04)

    引言 本文主要目标是整理下我在2016年第一季度针对Android学习的内容,不会深入细节,只是简单聊聊框架以及学习的方法. 我的Android之路 因为之前对Android有一个简单的接触,研究生期 ...

  9. linux远程拷贝命令-scp

    因为某种原因需要远程一个CentOS主机,只能通过ssh访问并下载文件.搞了半天不知道怎么处理文件,比如上传和下载.那就学习下吧. 基本命令格式 由于使用ssh,登录之后的本机地址是不需要给出的.但是 ...

  10. GNU make简介

    引言 接触开源项目有一段时间了,对自动化编译工具一直很好奇.近期有时间正好整理下GNU make.后续可以深入了解下. 本文主要整理GNU make的学习的基本资料,同时简要介绍make的功能.语法. ...