这是一种位集合,操作一组布尔值的时候可以通过(或or,与and,异或xor)等方法快速改变其组内某一部分值
BitSet bits1 = new BitSet(10);
BitSet bits2 = new BitSet(10);
for(int i=1;i<21;i++)
{
if(i%2==0)
{
bits1.set(i);
}
if(i%3==0)
{
bits2.set(i);
}
else
continue;
}
首先对两个BitSet变量赋值结果为
{2, 4, 6, 8, 10, 12, 14, 16, 18, 20}
{3, 6, 9, 12, 15, 18}
bits1.xor(bits2);
System.out.println("两集合异或:"+bits1);
两集合异或:{2, 3, 4, 8, 9, 10, 14, 15, 16, 20},调用的是bits1的方法,这是bits1目前的值,bits2仍为原数组
bits1.and(bits2);
System.out.println("两集合并:"+bits1);
结果:两集合并:{3, 9, 15}
注意:调用的一直是bits1内的方法,bits2的值一直保持为{3, 6, 9, 12, 15, 18}
bits1.cardinality( )此方法是判断集合内设置为true的个数
System.out.println("设置为true的位数:"+bits1.cardinality( ));
结果为( 设置为true的位数:3 )
重点:这里有一个重点需要先知道,BitSet集合所显示出来的数字都是被设置为true的,比如集合{-1,0,3,6}相当于其有{-1,0,1,2,3,4,5,6}这几个元素,分别对应{true,true,false,false,true,false,false,true}只有为true的地方才会被显示出来,所以集合的长度实际为7
bits1.clear(15);//参数为要删除的集合里的某个数值,(并非该位的值为15,可将其当作序号理解,第15位值有true变为false)
System.out.println("清除值为15后:"+bits1);
清除值为15后:{3, 9}
//bits2.clear();//将集合里所有元素清除
//bits2.flip(3);//集合中无该参数,则添加入集合,有该参数则从集合中删除
bits2.flip(1,4);/*将【min,max)范围内有该元素的删除,无的加入;(相当于非)
//bits2.clear(1,3);//文档写其作用是清除下标【min,max)中的元素,不过测试了输出结果并没有出现该作用,这个问题待解决
bits1.equals(bits2);//判断两集合是否相等,是为true,不等为false
bits2.get(3); //判断集合内是否有该参数,返回值为boolean型,即判断第三位的值是否被设置为true,集合内是否出现
bits2.get(1,15));/*get(min,max)返回【min,max)内的一个新集合,集合为原集合在该范围内的元素分别减1, 如原集合{2,3,4},返回{1,2,3}*/
bits2.hashCode();//返回哈希值
bits1.intersects(bits2));//判断两个集合是否有某元素相同,即有同一个位被设置为true
bits1.isEmpty();//集合是否为空,为空则true
bits1.length();//返回该集合最大值加1,如{2,6},最大为6,返回7
(这个length()方法可以结合上面提到的重点理解)
bits1.nextClearBit(9));/*返回从该参数开始的集合中,值为false的下一个元素,如集合{2,6},bits1.nextClearBit(1),则返回1,bits1.nextClearBit(6),则返回7*/
bits1.set('0'); //加入Ascll码,集合会将其显示为48
bits1.set(1,5);//将范围【1,5)设置为true
最后一个是bits1.clone()克隆方法,文档说是返回与之相同的一个集合
但
BitSet b1 = new BitSet();
b1 = bits1.clone();
会编译错误,此处求大神指教
建议用
BitSet b1 = new BitSet();
b1 = bits1; 代替clone()方法