简介
BitSet
是一个在java.util
包下的工具类,在JDK 1.0
就已经存在了。但是比起位向量,我觉得BitSet
更加适合作为位图(BitMap
)索引。
示例
前文提到过BitSet
可以用来做位图索引,下面我将用一个例子向大家展示怎么使用BitSet
。
假设存在以下业务场景,给两批人数相同的人分配序号,请实现以下功能:
- 找出两批人中,男性和女性的人数
- 序号相同,且性别不同进行婚姻匹配
实体
/**
* @author RJH
* create at 2018/11/28
*/
public class Person {
/**
* 主键
*/
private long id;
/**
* 性别,true为男性,false为女性
*/
private boolean sex;
...省略getter/setter方法...
@Override
public String toString() {
return "Person{" +
"id=" + id +
", sex=" + (sex?"男":"女")+
'}';
}
}
使用BitSet
/**
* BitSet示例
* @author RJH
* create at 2018/11/28
*/
public class BitSetDemo {
/**
* 随机生成数据
* @param num
* @return
*/
public static List<Person> generatePeople(int num){
List<Person> people=new ArrayList<>();
Random random=new Random();
for(int i=0;i<10;i++){
Person p=new Person();
if(random.nextInt(5)%2==0){
p.setSex(true);
}
people.add(p);
}
return people;
}
/**
* 生成位图索引
* @param people
* @return
*/
public static BitSet getBitSet(List<Person> people){
BitSet bitSet=new BitSet();
for(int i=0;i<people.size();i++){
if(people.get(i).isSex()){
bitSet.set(i);
}
}
return bitSet;
}
public static void main(String[] args) {
List<Person> people1=generatePeople(10);
List<Person> people2=generatePeople(10);
System.out.println("第一批人:"+people1);
System.out.println("第二批人:"+people2);
BitSet bitSet1=getBitSet(people1);
BitSet bitSet2=getBitSet(people2);
System.out.println("第一批人中男性个数:"+bitSet1.cardinality()+",女性个数:"+(10-bitSet1.cardinality()));
System.out.println("第二批人中男性个数:"+bitSet2.cardinality()+",女性个数:"+(10-bitSet2.cardinality()));
//使用异或(xor)找出序号相同性别不同的人
bitSet1.xor(bitSet2);
System.out.println("婚配人数:"+bitSet1.cardinality());
}
}
运行结果
第一批人:[Person{id=0, sex=女}, Person{id=0, sex=男}, Person{id=0, sex=女}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=女}]
第二批人:[Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=女}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=女}, Person{id=0, sex=男}, Person{id=0, sex=男}, Person{id=0, sex=男}]
第一批人中男性个数:7,女性个数:3
第二批人中男性个数:8,女性个数:2
婚配人数:3