一、什么是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使用场景和示例相关推荐

  1. java bitset用途_浅谈Java BitSet使用场景和代码示例

    搜索热词 @H_502_0@一.什么是BitSet? @H_502_0@ 注:以下内容来自JDK API: @H_502_0@ BitSet类实现了一个按需增长的位向量.位Set的每一个组件都有一个b ...

  2. java组合与继承始示例_排列组合:用公式示例解释的差异

    java组合与继承始示例 Permutations and Combinations are super useful in so many applications – from Computer ...

  3. java语音验证码_Java代码示例_Java语音验证接口 | 微米-中国领先的短信彩信接口平台服务商...

    Java语音验证接口代码示例 请求 import java.util.HashMap; import java.util.Map; public class IvrDemo { /** * 语音验证接 ...

  4. 【简单易懂】Java字符串应用场景:数字金额转换成大写汉字金额【金额转换】

    Java字符串应用场景:数字金额转换成汉字金额 文章目录 Java字符串应用场景:数字金额转换成汉字金额 前言 一.String简单介绍 二.字符串在开发中的应用场景 三.金额转换 3.1解题思路 3 ...

  5. 10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...

  6. Java IOUtils.copy方法代码示例(亲测)

    本文整理汇总了Java中org.apache.commons.io.IOUtils.copy方法的典型用法代码示例.如果您正苦于以下问题:Java IOUtils.copy方法的具体用法?Java I ...

  7. Java中的Volatile如何工作? Java中的volatile关键字示例

    如何在Java中使用Volatile关键字 在Java采访中,什么是volatile变量以及何时在Java中使用volatile变量是Java 采访中一个著名的多线程采访问题 . 尽管许多程序员都知道 ...

  8. java自建ocr完整示例_Java 7:完整的invokedynamic示例

    java自建ocr完整示例 我当前的Java 7系列中的另一个博客条目. 这次它处理的是invokedynamic,这是JVM上用于方法调用的新字节码指令. invokedynamic指令允许呼叫站点 ...

  9. Java异常处理教程(包含示例和最佳实践)

    异常是可能在程序执行期间发生的错误事件,它会破坏其正常流程. Java提供了一种健壮且面向对象的方式来处理异常情况,称为Java异常处理 . 我们将在本教程中研究以下主题. Java异常处理概述 异常 ...

最新文章

  1. 猜数字游戏python程序_python实现的简单猜数字游戏
  2. 云炬金融每日一题20211008
  3. 样例解释:1013 数素数 (20分)
  4. 这份1307页Android面试全套真题解析,源码+原理+手写框架
  5. MySQL幻读及解决方法
  6. Array.sort排序
  7. 限流算法(漏桶算法、令牌桶算法)对比
  8. python消费kafka逻辑处理导致cpu升高_用Apache Kafka 和 Python 搭建分布式流处理系统[翻译]...
  9. MC56F8366 DSC并口卡配置详尽步骤
  10. 电脑扬声器没有声音,插上耳机也检测不到
  11. [全解] 刷机, BL 锁, Bootloader, Recovery, Magisk, Root, ADB, 线刷, 卡刷, 9008, 绕过 FRP
  12. 计算机增加一个硬盘怎么设置方法,电脑加硬盘【操作教程】
  13. bash: vi: command not found
  14. 快速批量创建文件夹、文件的快捷键
  15. 个人学习笔记——Python篇(基础)
  16. TensorFlow-GPU框架详细安装
  17. 是谁在我的心里打了个结(十七)袋子
  18. 高并发、高可用、高可靠微服务架构7大顶级设计思维模型
  19. 供销合作社改革聚合力 国稻种芯-兰州榆中:构建现代流通体系
  20. 推挽输出、漏极输出方式详解

热门文章

  1. Barts PE Builder——Windows系统维护完全图形化攻略
  2. 使用fork并发处理多个client的请求和对等通信p2p
  3. 让Maven项目使用Nexus作为远程仓库的settings.xml配置
  4. 新版微信对付款码截屏做处理 防止被骗
  5. (CodeForces 548B 暴力) Mike and Fun
  6. Oracle数据库之PL/SQL程序基础设计
  7. SqlServer表死锁的解决方法
  8. 在Flutter中嵌入Native组件的正确姿势
  9. MySQL 解压缩安装
  10. 图的单源最短路径,Floyd算法(数据结构c++)