BitSet怎么在Java中使用

  介绍

本篇文章为大家展示了BitSet怎么在Java中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强>一、什么是BitSet ?

BitSet类实现了一个按需增长的位向量。位组的每一个组件都有一个布尔值。用非负的整数将BitSet的位编入索引。可以对每个编入索引的位进行测试,设置或者清除。通过逻辑与,逻辑或和逻辑异或操作,可以使用一个BitSet修改另一个BitSet的内容。

默认情况下,设置中所有位的初始值都是假的。

每个位组都有一个当前大小,也就是该位设置当前所用空间的位数。注意,这个大小与位组的实现有关,所以它可能随实现的不同而更改。位设置的长度与位设置的逻辑长度有关,并且是与实现无关而定义的。

一个BitSet类创建一种特殊类型的数组来保存位值.BitSet中数组大小会随需要增加。这和位向量(vectorofbits)比较类似。

这是一个传统的类,但它在Java2中被完全重新设计。

BitSet定义了两个构造方法。

第一个构造方法创建一个默认的对象:

<代码> BitSet()

第二个方法允许用户指定初始大小,所有位初始化为0。

<代码> BitSet (intsize)

<强>二、Java BitSet实现原理

在Java中,BitSet的实现位于Java。util包中:

public  class  BitSet  implements 可克隆,,java.io.Serializable    {   private  final  static  int  ADDRESS_BITS_PER_WORD =, 6;   private  final  static  int  BITS_PER_WORD =, 1, & lt; & lt;, ADDRESS_BITS_PER_WORD;   private  final  static  int  BIT_INDEX_MASK =, BITS_PER_WORD 作用;1;/*,Used 用shift  left 或是right  for  a  partial  word  mask  */private  static  final  long  WORD_MASK =, 0 xffffffffffffffffl;   private  static  final  ObjectStreamField [], serialPersistentFields =,,{   ,,,new  ObjectStreamField (“bits",,长[]. class),   }   ;/* *   ,,*,从而internal  field  corresponding 用,serialField “bits"。   ,,*/private 长[],话说;   …   }

可以看的到,BitSet的底层实现是使用长数组作为内部存储结构的,所以BitSet的大小为长类型大小(64位)的整数倍。

它有两个构造函数:

1, BitSet():创建一个新的位设置,默认大小是64位。

public  BitSet (),   {   ,,,initWords (BITS_PER_WORD);   ,,,sizeIsSticky =,假;   }

2, BitSet (int nbits):创建一个位,它的初始大小足以显式表示索引范围在0到nbits-1的位。

public  BitSet (int  nbits)   ,,{   ,,,//,nbits 停下来# 39;t  be 阴性;,size  0, is 好吧   ,,,if  (nbits  & lt;, 0)   ,,,,,throw  new  NegativeArraySizeException (“nbits  & lt;, 0:,“, +, nbits);   ,,,initWords (nbits);   ,,,sizeIsSticky =,真的;   以前,,}

注:

1,如果指定了bitset的初始化大小,那么会把他规整到一个大于或者等于这个数字的64的整倍数。比如64位,bitset的大小是1个长,而65位时,bitset大小是2个长,即128位。做这么一个规定,主要是为了内存对齐,同时避免考虑到不要处理特殊情况,简化程序。

2: bitset大小的方法:返回此bitset表示位值时实际使用空间的位数,值是64的整数倍

长度方法:返回此bitset的“逻辑大小”:bitset中最高设置位的索引加1

<强>三、使用场景

常见的应用场景是对海量数据进行一些统计工作,比如日志分析,用户数统计等。

之前在阿里的实习面试就被问到一道题:有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来?

代码示例如下:

public  class 阿里巴巴   {   public  static  void  main (String [], args)   {才能   Random 随机=new 随机();   ListBitSet怎么在Java中使用