Java BitSet使用场景和示例
一、什么是BitSet?
注:以下内容来自JDK API:
BitSet类实现了一个按需增长的位向量。位Set的每一个组件都有一个boolean值。用非负的整数将BitSet的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或和逻辑异或操作,可以使用一个 BitSet修改另一个 BitSet的内容。
默认情况下,set 中所有位的初始值都是false。
每个位 set 都有一个当前大小,也就是该位 set 当前所用空间的位数。注意,这个大小与位 set 的实现有关,所以它可能随实现的不同而更改。位 set 的长度与位 set 的逻辑长度有关,并且是与实现无关而定义的。
二、Java BitSet实现原理
在java中,BitSet的实现位于java.util包中:
public class BitSet implements Cloneable, java.io.Serializable {private final static int ADDRESS_BITS_PER_WORD = 6;private final static int BITS_PER_WORD = 1 << ADDRESS_BITS_PER_WORD;private final static int BIT_INDEX_MASK = BITS_PER_WORD - 1;/* Used to shift left or right for a partial word mask */private static final long WORD_MASK = 0xffffffffffffffffL;private static final ObjectStreamField[] serialPersistentFields ={new ObjectStreamField("bits", long[].class),};/*** The internal field corresponding to the serialField "bits".*/private long[] words;..... }
可以看到,BitSet的底层实现是使用long数组作为内部存储结构的,所以BitSet的大小为long类型大小(64位)的整数倍。
它有两个构造函数:
1、BitSet():创建一个新的位 set,默认大小是64位。
public BitSet() {initWords(BITS_PER_WORD);sizeIsSticky = false; }
2、BitSet(int nbits):创建一个位set,它的初始大小足以显式表示索引范围在
0
到 nbits-1 的位。
public BitSet(int nbits){// nbits can't be negative; size 0 is OKif (nbits < 0)throw new NegativeArraySizeException("nbits < 0: " + nbits);initWords(nbits);sizeIsSticky = true;}
注:
1、如果指定了bitset的初始化大小,那么会把他规整到一个大于或者等于这个数字的64的整倍数。比如64位,bitset的大小是1个long,而65位时,bitset大小是2个long,即128位。做这么一个规定,主要是为了内存对齐,同时避免考虑到不要处理特殊情况,简化程序。
2:BitSet的size方法:返回此 BitSet 表示位值时实际使用空间的位数,值是64的整数倍
length方法:返回此 BitSet 的“逻辑大小”:BitSet 中最高设置位的索引加 1
三、使用场景
常见的应用场景是对海量数据进行一些统计工作,比如日志分析、用户数统计等。
之前在阿里的实习面试就被问到一道题:有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来?
代码示例如下:
public class Alibaba {public static void main(String[] args){Random random=new Random();List<Integer> list=new ArrayList<>();for(int i=0;i<10000000;i++){int randomResult=random.nextInt(100000000);list.add(randomResult);}System.out.println("产生的随机数有");for(int i=0;i<list.size();i++){System.out.println(list.get(i));}BitSet bitSet=new BitSet(100000000);for(int i=0;i<10000000;i++){bitSet.set(list.get(i));}System.out.println("0~1亿不在上述随机数中有"+bitSet.size());for (int i = 0; i < 100000000; i++){if(!bitSet.get(i)){System.out.println(i);}} } }
四、参考资料
1、http://blog.csdn.net/haojun186/article/details/8482343
2、http://www.open-open.com/lib/view/open1406379530429.html
Java BitSet使用场景和示例相关推荐
- java bitset用途_浅谈Java BitSet使用场景和代码示例
搜索热词 @H_502_0@一.什么是BitSet? @H_502_0@ 注:以下内容来自JDK API: @H_502_0@ BitSet类实现了一个按需增长的位向量.位Set的每一个组件都有一个b ...
- java组合与继承始示例_排列组合:用公式示例解释的差异
java组合与继承始示例 Permutations and Combinations are super useful in so many applications – from Computer ...
- java语音验证码_Java代码示例_Java语音验证接口 | 微米-中国领先的短信彩信接口平台服务商...
Java语音验证接口代码示例 请求 import java.util.HashMap; import java.util.Map; public class IvrDemo { /** * 语音验证接 ...
- 【简单易懂】Java字符串应用场景:数字金额转换成大写汉字金额【金额转换】
Java字符串应用场景:数字金额转换成汉字金额 文章目录 Java字符串应用场景:数字金额转换成汉字金额 前言 一.String简单介绍 二.字符串在开发中的应用场景 三.金额转换 3.1解题思路 3 ...
- 10个Java 8 Lambda表达式经典示例
Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...
- Java IOUtils.copy方法代码示例(亲测)
本文整理汇总了Java中org.apache.commons.io.IOUtils.copy方法的典型用法代码示例.如果您正苦于以下问题:Java IOUtils.copy方法的具体用法?Java I ...
- Java中的Volatile如何工作? Java中的volatile关键字示例
如何在Java中使用Volatile关键字 在Java采访中,什么是volatile变量以及何时在Java中使用volatile变量是Java 采访中一个著名的多线程采访问题 . 尽管许多程序员都知道 ...
- java自建ocr完整示例_Java 7:完整的invokedynamic示例
java自建ocr完整示例 我当前的Java 7系列中的另一个博客条目. 这次它处理的是invokedynamic,这是JVM上用于方法调用的新字节码指令. invokedynamic指令允许呼叫站点 ...
- Java异常处理教程(包含示例和最佳实践)
异常是可能在程序执行期间发生的错误事件,它会破坏其正常流程. Java提供了一种健壮且面向对象的方式来处理异常情况,称为Java异常处理 . 我们将在本教程中研究以下主题. Java异常处理概述 异常 ...
最新文章
- 猜数字游戏python程序_python实现的简单猜数字游戏
- 云炬金融每日一题20211008
- 样例解释:1013 数素数 (20分)
- 这份1307页Android面试全套真题解析,源码+原理+手写框架
- MySQL幻读及解决方法
- Array.sort排序
- 限流算法(漏桶算法、令牌桶算法)对比
- python消费kafka逻辑处理导致cpu升高_用Apache Kafka 和 Python 搭建分布式流处理系统[翻译]...
- MC56F8366 DSC并口卡配置详尽步骤
- 电脑扬声器没有声音,插上耳机也检测不到
- [全解] 刷机, BL 锁, Bootloader, Recovery, Magisk, Root, ADB, 线刷, 卡刷, 9008, 绕过 FRP
- 计算机增加一个硬盘怎么设置方法,电脑加硬盘【操作教程】
- bash: vi: command not found
- 快速批量创建文件夹、文件的快捷键
- 个人学习笔记——Python篇(基础)
- TensorFlow-GPU框架详细安装
- 是谁在我的心里打了个结(十七)袋子
- 高并发、高可用、高可靠微服务架构7大顶级设计思维模型
- 供销合作社改革聚合力 国稻种芯-兰州榆中:构建现代流通体系
- 推挽输出、漏极输出方式详解