相当于每个bit存储一个int数,对于去重,求并集交集啥的特别快速,不占内存,用原生list耗时且占内存,如下面的例子,用来计算交集个数快了1000倍,基本用bitset,都是纳秒级别完成,相当惊人。
and(BitSet set) :执行此目标位集与参数位集的逻辑与。修改此位集,以便其中的每个位都具有值true当且仅当它最初都具有值true并且位集参数中的相应位也具有值true 。
public static void main(String[] args) {
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
for (int i = 0; i < 200000; i++) {
list1.add(i);
}
for (int i = 0; i < 300000; i++) {
list2.add(i);
}
long count;
long time1 = System.nanoTime();
count = list1.stream().filter(list2::contains).count();
long time = System.nanoTime() - time1;
System.out.println(count + ":" + time + "纳秒" + time / 1000000000 + "秒");
long time2 = System.nanoTime();
count = intersection(list1, list2);
time = System.nanoTime() - time2;
System.out.println(count + ":" + time + "纳秒" + time / 1000000000 + "秒");
}
public static int intersection(List<Integer> list1, List<Integer> list2) {
BitSet bitSet = new BitSet(list1.size());
BitSet bitSet1 = new BitSet(list2.size());
for (Integer l1 : list1) {
bitSet.set(l1);
}
for (Integer l2 : list2) {
bitSet1.set(l2);
}
bitSet.and(bitSet1);
return bitSet.cardinality();
}
200000:18335533600纳秒18秒
200000:18611800纳秒0秒
BitSet,目前只能存储int,如果想存储想存储long,用以下这个
https://github.com/RoaringBitmap/RoaringBitmap