本篇文章为大家展示了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中使用